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

2019-06-21 20:07:51 +08:00
 EthanDon

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

3163 次点击
所在节点    程序员
34 条回复
Vegetable
2019-06-21 20:12:25 +08:00
http 是半双工的,这个和需求好像是矛盾的,读到一半断开应该是可以,返回的话还算是 http 吗?
misaka19000
2019-06-21 20:17:55 +08:00
自己解析豹纹呗
ruoxie
2019-06-21 20:18:06 +08:00
查一下 Range 请求头相关的
blackcurrant
2019-06-21 20:21:58 +08:00
"网上冲浪" 好久没听到这个词了
EthanDon
2019-06-21 20:23:53 +08:00
@Vegetable 也是,返回之后并不知道是不是请求成功了,状态码是不是 200
EthanDon
2019-06-21 20:24:38 +08:00
@misaka19000 需求是还在传输阶段就段卡,解析报文应该得等到所有报文都到达了才能进行吧?
EthanDon
2019-06-21 20:26:35 +08:00
@ruoxie range 已经用上了,现在的需求时指定了 range 之后,发送请求,为了防止响应的报文过大长时间阻塞在这个 http 请求上,需要在读取一定的数据后就返回
不知道 go 里可不可以在超时以后返回已经读到的数据
guonaihong
2019-06-21 20:30:09 +08:00
这个需求有点类似开发 API 网关,要限制流量的 limit 指令。
你只要自己实现 Read 接口赋值给 r.Body。自己实现的接口加个计算器就行。
misaka19000
2019-06-21 20:30:40 +08:00
你这个需求可以用 nginx 实现,client_max_body_size
blless
2019-06-21 20:34:17 +08:00
bufio 还是哪个库 可以创建一个指定大小的 reader,读到后检查一下是不是 EOF 应该可以吧
loading
2019-06-21 20:36:02 +08:00
@blackcurrant “网上冲浪了两天”用时髦点的说法有两种:
1.在网上浪了两天。
2.滑水了两天。
cabing
2019-06-21 20:39:19 +08:00
为啥要读取一段字段就立即返回呢?
loading
2019-06-21 20:39:25 +08:00
楼主的需求是怕阻塞太久,虽然计算发送字节后主动切断是可以,但是我认为你应该用计时器做,毕竟你关心的似乎是时长?
EthanDon
2019-06-21 20:43:26 +08:00
@cabing
@loading 时长是一方面,另一方面关心网络情况,需要验证服务器能否在超时时间内返回足够多的数据
EthanDon
2019-06-21 20:44:56 +08:00
@guonaihong r 是 request 吗?兄台可否细说?多谢!
EthanDon
2019-06-21 20:45:26 +08:00
@misaka19000 项目是轻依赖哦,整个环境除了 go 没其他的了
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
}
```
polebug
2019-06-21 20:47:44 +08:00
你这得实时解析报文啊 还得计数 真的不会影响性能吗
guonaihong
2019-06-21 20:48:28 +08:00
@EthanDon r 是 http.Request。
guonaihong
2019-06-21 20:51:13 +08:00
@EthanDon 兄台有感觉了麻?

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

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

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

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

© 2021 V2EX