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
- 1Body closed in a middleware layer before the handler reads it
- 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()
Same error in other languages
Sources
Official documentation ↗
Go standard library
Content generated with AI assistance and reviewed for accuracy. Found an error? hello@errcodes.dev