http.ErrBodyReadAfterClose
GoERRORNotableHTTP

http: invalid Read on closed Body

Quick Answer

Read the body fully before closing it, and defer Close only after the read is complete.

What this means

Returned when code attempts to read from an http.Response.Body after it has already been closed. Commonly caused by middleware or defer ordering issues.

Why it happens
  1. 1Body closed in a middleware layer before the handler reads it
  2. 2Double-close via defer combined with an early manual close

Fix

Read then close

Read then close
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil { log.Fatal(err) }

Why this works

Deferring Close after ReadAll ensures the body is fully consumed before disposal.

Code examples
Correct patterngo
resp, _ := http.Get(url)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
Detectgo
_, err := io.ReadAll(resp.Body)
if errors.Is(err, http.ErrBodyReadAfterClose) {
    fmt.Println("body already closed")
}
Buffer before closego
var buf bytes.Buffer
io.Copy(&buf, resp.Body)
resp.Body.Close()
Sources
Official documentation ↗

Go standard library

Content generated with AI assistance and reviewed for accuracy. Found an error? hello@errcodes.dev

← All Go errors