我在网上冲浪两天了也没发现方法
1
Vegetable 2019-06-21 20:12:25 +08:00
http 是半双工的,这个和需求好像是矛盾的,读到一半断开应该是可以,返回的话还算是 http 吗?
|
2
misaka19000 2019-06-21 20:17:55 +08:00 via Android
自己解析豹纹呗
|
3
ruoxie 2019-06-21 20:18:06 +08:00
查一下 Range 请求头相关的
|
4
blackcurrant 2019-06-21 20:21:58 +08:00
"网上冲浪" 好久没听到这个词了
|
6
EthanDon OP @misaka19000 需求是还在传输阶段就段卡,解析报文应该得等到所有报文都到达了才能进行吧?
|
7
EthanDon OP @ruoxie range 已经用上了,现在的需求时指定了 range 之后,发送请求,为了防止响应的报文过大长时间阻塞在这个 http 请求上,需要在读取一定的数据后就返回
不知道 go 里可不可以在超时以后返回已经读到的数据 |
8
guonaihong 2019-06-21 20:30:09 +08:00
这个需求有点类似开发 API 网关,要限制流量的 limit 指令。
你只要自己实现 Read 接口赋值给 r.Body。自己实现的接口加个计算器就行。 |
9
misaka19000 2019-06-21 20:30:40 +08:00
你这个需求可以用 nginx 实现,client_max_body_size
|
10
blless 2019-06-21 20:34:17 +08:00 via Android
bufio 还是哪个库 可以创建一个指定大小的 reader,读到后检查一下是不是 EOF 应该可以吧
|
11
loading 2019-06-21 20:36:02 +08:00
|
12
cabing 2019-06-21 20:39:19 +08:00
为啥要读取一段字段就立即返回呢?
|
13
loading 2019-06-21 20:39:25 +08:00
楼主的需求是怕阻塞太久,虽然计算发送字节后主动切断是可以,但是我认为你应该用计时器做,毕竟你关心的似乎是时长?
|
15
EthanDon OP @guonaihong r 是 request 吗?兄台可否细说?多谢!
|
16
EthanDon OP @misaka19000 项目是轻依赖哦,整个环境除了 go 没其他的了
|
17
guonaihong 2019-06-21 20:47:01 +08:00
@blless 用 bufio,又开辟了一个 buf,多了一层内存拷贝。如果只是关心个数,只用一个计数器就行。 比如定义如下结构
```go type maxBytesReader struct { w http.ResponseWriter r io.ReadCloser // underlying reader n int64 // max bytes remaining err error // sticky error } ``` |
18
polebug 2019-06-21 20:47:44 +08:00
你这得实时解析报文啊 还得计数 真的不会影响性能吗
|
19
guonaihong 2019-06-21 20:48:28 +08:00
@EthanDon r 是 http.Request。
|
20
guonaihong 2019-06-21 20:51:13 +08:00
@EthanDon 兄台有感觉了麻?
|
21
loading 2019-06-21 20:55:39 +08:00
我给你浪了 10 分钟:
aHR0cHM6Ly9jb2xvYnUuY29tLzIwMTYvMDcvMDEvdGhlLWNvbXBsZXRlLWd1aWRlLXRvLWdvbGFuZy1uZXQtaHR0cC10aW1lb3V0cy8= 如何切断一个 http,都是在基础包的代码里面。 如果你说的是 request,你应该知道如何浪出来吧。 |
22
gamexg 2019-06-21 20:56:48 +08:00
?
http 标准库的 body 本身是流式实现,你需要多长的 body 就读取多长,读够后直接关闭即可。 另外 http.Client 带超时控制,可能是你想要的。 如果需要更底层的控制,可以自己建立 tcp 连接,然后 http.NewRequest 后直接 Write 到自己的 tcp 连接。读取时使用 http.ReadResponse 读取即可。http.ReadResponse 接收的是 bufio.Reader,意味着你可以用 io.LimitReader 封装 tcp 连接实现限制尺寸。 |
23
gamexg 2019-06-21 20:57:43 +08:00
@gamexg #22 htt.Get 等函数只要接收到 http 响应头即可返回 ,body 等内容是你从 Body 读取时才从 tcp 连接读取的。
|
24
Leigg 2019-06-21 21:05:32 +08:00 via iPhone
数据分段传啊
|
25
guonaihong 2019-06-21 21:10:19 +08:00
|
27
flynaj 2019-06-22 09:22:05 +08:00 via Android
HTTP 协议不成的话,你可以 socket 编程。自己处理数据包,只是工程有点大。
|
28
EthanDon OP @guonaihong 周末去浪浪,我这就去了解一下
|
31
EthanDon OP |