关闭连接后写入响应错误

时间:2020-04-09 12:13:14

标签: http go

http.Response.Write导致'use of closed network connection'关闭net.Conn收到数据后,导致http.Response错误。例如。我需要做这样的事情:

func Do(req *http.Request) *http.Response {
    // ...

    req.Write(conn)

    var r = bufio.NewReader(conn)
    var resp = http.ReadResponse(r, req)
    conn.Close()

    return resp
}

//...
var resp = Do(req)
resp.Write(anotherConn) // here is the error

,但最后一行给出了以上错误。您可以说一个明显的解决方案是conn.Close之后的resp.Write,但我这样做的原因是Do必须将req写到{{1} },它会自行创建,然后仅返回conn

我唯一感兴趣的是respconn之间的关系。我以为响应会将所有接收到的数据本身保存在req中,然后不依赖于它从中接收数据的连接。但这似乎不是这样。

1 个答案:

答案 0 :(得分:3)

ReadResponse读取状态行和标头,然后在Respons.Body中公开响应正文,该响应正文直接访问基础连接以即时读取正文,而不是加载整个正文(数兆字节)存储到内存中。这允许实现尽可能高效,例如。流处理主体,而不是将其全部加载到内存中然后进行处理。

Per the docs

在读取“正文”字段时,响应正文将按需流式传输。如果网络连接失败或服务器终止响应,则Body.Read调用将返回错误。