Go 怎么实现 http 请求读到一定的字节数之后立刻返回?

2019 年 6 月 21 日
 EthanDon

我在网上冲浪两天了也没发现方法

3928 次点击
所在节点    程序员
34 条回复
Vegetable
2019 年 6 月 21 日
http 是半双工的,这个和需求好像是矛盾的,读到一半断开应该是可以,返回的话还算是 http 吗?
misaka19000
2019 年 6 月 21 日
自己解析豹纹呗
ruoxie
2019 年 6 月 21 日
查一下 Range 请求头相关的
blackcurrant
2019 年 6 月 21 日
"网上冲浪" 好久没听到这个词了
EthanDon
2019 年 6 月 21 日
@Vegetable 也是,返回之后并不知道是不是请求成功了,状态码是不是 200
EthanDon
2019 年 6 月 21 日
@misaka19000 需求是还在传输阶段就段卡,解析报文应该得等到所有报文都到达了才能进行吧?
EthanDon
2019 年 6 月 21 日
@ruoxie range 已经用上了,现在的需求时指定了 range 之后,发送请求,为了防止响应的报文过大长时间阻塞在这个 http 请求上,需要在读取一定的数据后就返回
不知道 go 里可不可以在超时以后返回已经读到的数据
guonaihong
2019 年 6 月 21 日
这个需求有点类似开发 API 网关,要限制流量的 limit 指令。
你只要自己实现 Read 接口赋值给 r.Body。自己实现的接口加个计算器就行。
misaka19000
2019 年 6 月 21 日
你这个需求可以用 nginx 实现,client_max_body_size
blless
2019 年 6 月 21 日
bufio 还是哪个库 可以创建一个指定大小的 reader,读到后检查一下是不是 EOF 应该可以吧
loading
2019 年 6 月 21 日
@blackcurrant “网上冲浪了两天”用时髦点的说法有两种:
1.在网上浪了两天。
2.滑水了两天。
cabing
2019 年 6 月 21 日
为啥要读取一段字段就立即返回呢?
loading
2019 年 6 月 21 日
楼主的需求是怕阻塞太久,虽然计算发送字节后主动切断是可以,但是我认为你应该用计时器做,毕竟你关心的似乎是时长?
EthanDon
2019 年 6 月 21 日
@cabing
@loading 时长是一方面,另一方面关心网络情况,需要验证服务器能否在超时时间内返回足够多的数据
EthanDon
2019 年 6 月 21 日
@guonaihong r 是 request 吗?兄台可否细说?多谢!
EthanDon
2019 年 6 月 21 日
@misaka19000 项目是轻依赖哦,整个环境除了 go 没其他的了
guonaihong
2019 年 6 月 21 日
@blless 用 bufio,又开辟了一个 buf,多了一层内存拷贝。如果只是关心个数,只用一个计数器就行。 比如定义如下结构
```go
type maxBytesReader struct {
w http.ResponseWriter
r io.ReadCloser // underlying reader
n int64 // max bytes remaining
err error // sticky error
}
```
polebug
2019 年 6 月 21 日
你这得实时解析报文啊 还得计数 真的不会影响性能吗
guonaihong
2019 年 6 月 21 日
@EthanDon r 是 http.Request。
guonaihong
2019 年 6 月 21 日
@EthanDon 兄台有感觉了麻?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/576288

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX