BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / golang / #466同步于 2016/7/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖

[讨论]作为client时,是否有必要调用http.Request.Body.Close()

KajiRyouji
2016/7/12镜像同步6 回复
搞了一个双写的http网关,接受http请求,然后转发给两个upstream 用Pipe配合MultiWriter来把进来的一路stream复制成两条stream:构造两对Pipe,把Reader赋值给上游的Request.Body;把进来的request.Body copy给multi writer;完后关闭pipe writer(没有关闭pipe reader) 发现有个客户端过来的request,没有携带content-length,对于这种情况,我有设置Request.Close = true 这种请求转发给一个golang写的上游服务器是没有问题的,但是转发给另外一个python上游服务器时,返回了411(no content length) 我尝试在client.Do(request)返回之后,关闭pipe reader,解决了这个问题,但是有个疑问,还没来得及看代码: 我关闭了pipe writer,那么pipe reader应该会返回eof,client没有主动close掉reader?还是说python的http server有问题?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
nuanyangyang机器人#1 · 2016/7/12
理论上,服务器可以根据请求,给出任何它认为合理的响应。所以,如果服务器认为客户端应该提供content-length,它就会在没有content-length的情况下回复411.这也不算错。 所以我认为真正应该问的是:你认为你的网关给后端服务器发送的请求中是否应该有content-length呢?如果你认为必须有,那就是发送request的那个客户端的过错了,你的网关也返回给它411就行了。如果你认为这个content-length可以有可以没有,那么那个上游python服务器就应该修改了。 【 在 KajiRyouji 的大作中提到: 】 : 搞了一个双写的http网关,接受http请求,然后转发给两个upstream : 用Pipe配合MultiWriter来把进来的一路stream复制成两条stream:构造两对Pipe,把Reader赋值给上游的Request.Body;把进来的request.Body copy给multi writer;完后关闭pipe writer(没有关闭pipe reader) : 发现有个客户端过来的request,没有携带content-length,对于这种情况,我有设置Request.Close = true : ...................
qyz0123321机器人#2 · 2016/7/13
【 在 nuanyangyang 的大作中提到: 】 : 理论上,服务器可以根据请求,给出任何它认为合理的响应。所以,如果服务器认为客户端应该提供content-length,它就会在没有content-length的情况下回复411.这也不算错。 : 所以我认为真正应该问的是:你认为你的网关给后端服务器发送的请求中是否应该有content-length呢?如果你认为必须有,那就是发送request的那个客户端的过错了,你的网关也返回给它411就行了。如果你认为这个content-length可以有可以没有,那么那个上游python服务器就应该修改了。 : [upload=1][/upload] : ................... 暖神最近都没有开始日常黑go了阿
nuanyangyang机器人#3 · 2016/7/13
【 在 qyz0123321 的大作中提到: 】 : : 暖神最近都没有开始日常黑go了阿 我本来就不是go程序猿,所以对go了解的也不多。 黑一次要查好多资料,最近懒得黑。
nullne机器人#4 · 2016/7/14
抱歉我只看到了图 图是几个意思 【 在 nuanyangyang 的大作中提到: 】 : 理论上,服务器可以根据请求,给出任何它认为合理的响应。所以,如果服务器认为客户端应该提供content-length,它就会在没有content-length的情况下回复411.这也不算错。 : 所以我认为真正应该问的是:你认为你的网关给后端服务器发送的请求中是否应该有content-length呢?如果你认为必须有,那就是发送request的那个客户端的过错了,你的网关也返回给它411就行了。如果你认为这个content-length可以有可以没有,那么那个上游python服务器就应该修改了。 : [upload=1][/upload] : ...................
nuanyangyang机器人#5 · 2016/7/14
【 在 nullne 的大作中提到: 】 : 抱歉我只看到了图 图是几个意思 自己理解吧
KajiRyouji机器人#6 · 2016/7/14
更新下问题,并不是关闭pipe的问题,而是踩了http库的一个坑 收到的http请求是chunked,但是http server会自动解chunked,request里content-length为-1 转发时构造的新Request,我也设置content-length为-1,但是没有设置ProtoMinor,http会按照http1.0处理,不编码成chunked,所以对端收到的就是即不包含content-length也没有chunkde编码的请求。。。 转发请求前,设置ProtoMinor为1,指示http按http1.1发送请求,就没问题。。。