Golang http.Post留下开放套接字

时间:2017-11-03 15:00:48

标签: go

我有以下golang代码,当它在自己的网络服务器内部调用时,似乎没有关闭套接字。这导致了太多的打开文件"信息。我已经阅读了所有关于Body.Close()的内容,你可以看到它在那里,但它仍然表现不佳。

我还缺少关于连接处理的其他内容吗?

func sendRequest(ctx context.Context, endpoint, uri string, data []byte) (int, []byte) {
    reqID := requestIDFromContext(ctx)
    // The servers have internally signed certs which are technically "not trusted"
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
    insecureclient := &http.Client{Transport: tr}

    // Build the correct URL
    url := endpoint + uri

    requestbody := bytes.NewBuffer(data)
    // Send our request and check for errors.
    fmt.Println(reqID, "Forwarding request to URL:", url)
    resp, err := insecureclient.Post(url, "application/json", requestbody)
    if err != nil {
        // This is where things happen when the connect goes bad
        fmt.Println(reqID, err)
        return 500, []byte("{}")
        //return handleConnectionError(ctx, data, uri)
    }
    defer resp.Body.Close()

    // Read response
    responsebody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(reqID, err)
        responsebody = []byte("{}")
    }

    return resp.StatusCode, responsebody
}

FWIW,改变代码以使用' http.NewRequest'然后是一个“不安全的客户。”'以及' Request.Close = true'似乎解决了这个问题。

1 个答案:

答案 0 :(得分:2)

每个客户端(更确切地说,传输)都维护自己的连接池。这意味着有一个连接"悬挂"在每次sendRequest调用后保持活动状态。而不是每次都创建一个新的客户端,重新使用它。