HTTP
http.Response.Body: 読み終えた後にCloseする
HTTPレスポンスのBodyは読み終えた後に必ずcloseし、接続を適切に解放します。
Sourceresponse_body.go
Go 1.22
package httpflow
import (
"io"
"net/http"
)
func ReadAndClose(response *http.Response) (string, error) {
defer response.Body.Close()
bytes, err := io.ReadAll(response.Body)
return string(bytes), err
}Testresponse_body_test.go
Go 1.22
package httpflow
import (
"net/http"
"strings"
"testing"
)
type trackedBody struct {
*strings.Reader
closed bool
}
func (body *trackedBody) Close() error {
body.closed = true
return nil
}
func TestHTTPResponseBodyは読み終えた後にCloseする(t *testing.T) {
body := &trackedBody{Reader: strings.NewReader("go")}
response := &http.Response{Body: body}
content, err := ReadAndClose(response)
if err != nil {
t.Fatal(err)
}
if content != "go" || !body.closed {
t.Fatalf("content = %q, closed = %t", content, body.closed)
}
}01Assertion
このテストで確認できること
- http.ResponseのBodyをio.ReadAllで読む
- defer response.Body.Close()によりclose済みになる
net/httpのClient.DoやGetで受け取るレスポンスは、Bodyをcloseする責務を呼び出し側が持ちます。本文を使わない場合も、成功したResponseのBodyはcloseします。
OBSERVED RESULT
io.ReadAll(response.Body) → "go"
response.Body.Close() → called