Multiple Header Writing in a Simple Go HTTP Program
A common issue in Go's net/http package is encountering the error "multiple response.WriteHeader calls." This occurs when multiple headers are written to the same HTTP response.
Consider the following code snippet:
import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) fmt.Println("Starting Server...") log.Fatal(http.ListenAndServe(":5678", nil)) } func HandleIndex(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) w.Write([]byte("Hello, World!")) }
When run and accessed through localhost:5678 in Chrome, the console displays:
Starting Server... / 2015/01/15 13:41:29 http: multiple response.WriteHeader calls /favicon.ico 2015/01/15 13:41:29 http: multiple response.WriteHeader calls
Cause of Multiple Header Writing
The key to this error lies in the anonymous function used as the request handler:
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
This function prints the URL, spawns a new goroutine that calls HandleIndex(), and continues execution. If a handler function does not set a response status before the first Write call, Go automatically sets it to 200 (HTTP OK). However, if the handler finishes without writing to the response, Go will still set the status to 200.
In this case, the anonymous function sets no status and writes nothing, so Go sets the status to 200.
Goroutine and Multiple Header Writing
When HandleIndex() is invoked in a separate goroutine, the original anonymous function completes and sets the response header. Meanwhile, the new goroutine also sets the header, resulting in the error.
Solution
To resolve this error, either remove the go keyword to invoke HandleIndex() within the original goroutine or explicitly set the response status within the anonymous function.
The above is the detailed content of Why Does My Go HTTP Program Show 'http: multiple response.WriteHeader calls'?. For more information, please follow other related articles on the PHP Chinese website!