返回信息流搞了一个双写的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有问题?
这是一条镜像帖。来源:北邮人论坛 / golang / #466同步于 2016/7/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
[讨论]作为client时,是否有必要调用http.Request.Body.Close()
KajiRyouji
2016/7/12镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
理论上,服务器可以根据请求,给出任何它认为合理的响应。所以,如果服务器认为客户端应该提供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
: ...................
【 在 nuanyangyang 的大作中提到: 】
: 理论上,服务器可以根据请求,给出任何它认为合理的响应。所以,如果服务器认为客户端应该提供content-length,它就会在没有content-length的情况下回复411.这也不算错。
: 所以我认为真正应该问的是:你认为你的网关给后端服务器发送的请求中是否应该有content-length呢?如果你认为必须有,那就是发送request的那个客户端的过错了,你的网关也返回给它411就行了。如果你认为这个content-length可以有可以没有,那么那个上游python服务器就应该修改了。
: [upload=1][/upload]
: ...................
暖神最近都没有开始日常黑go了阿
【 在 qyz0123321 的大作中提到: 】
:
: 暖神最近都没有开始日常黑go了阿
我本来就不是go程序猿,所以对go了解的也不多。
黑一次要查好多资料,最近懒得黑。
抱歉我只看到了图 图是几个意思
【 在 nuanyangyang 的大作中提到: 】
: 理论上,服务器可以根据请求,给出任何它认为合理的响应。所以,如果服务器认为客户端应该提供content-length,它就会在没有content-length的情况下回复411.这也不算错。
: 所以我认为真正应该问的是:你认为你的网关给后端服务器发送的请求中是否应该有content-length呢?如果你认为必须有,那就是发送request的那个客户端的过错了,你的网关也返回给它411就行了。如果你认为这个content-length可以有可以没有,那么那个上游python服务器就应该修改了。
: [upload=1][/upload]
: ...................
更新下问题,并不是关闭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发送请求,就没问题。。。