Appels WriteHeader multiples dans un serveur HTTP simple
Un serveur HTTP de base implémenté dans Go à l'aide du package net/http présente un comportement inhabituel, car indiqué par le message d'erreur :
http: multiple response.WriteHeader calls
Cette erreur suggère que le serveur tente d'écrire l'en-tête de réponse plusieurs fois, ce qui n'est pas le cas. autorisé par la spécification HTTP. Analysons le code pour comprendre pourquoi ce problème se produit :
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!")) }
Analyse
Le problème principal réside dans la fonction anonyme enregistrée en tant que gestionnaire des requêtes entrantes :
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
Cette fonction imprime l'URL de la requête et démarre une nouvelle goroutine pour appeler HandleIndex(). Ensuite, il continue de s'exécuter normalement.
Si la fonction de gestionnaire ne définit pas l'état de la réponse ou n'écrit rien dans la réponse, Go définira automatiquement l'état sur 200 (HTTP OK) et reviendra. Ce comportement s'applique à la fonction anonyme de notre code, qui ne définit pas explicitement le statut de la réponse ni n'y écrit avant la ligne go HandleIndex(w, r).
Lorsque HandleIndex() est invoqué dans un autre goroutine, la fonction anonyme continue son exécution, se terminant par le traitement des requêtes. Étant donné que l’état de la réponse n’a pas été défini au préalable, Go le définira automatiquement sur 200 HTTP OK. Cependant, la goroutine générée tentera également de définir l'état de la réponse dans HandleIndex(), ce qui entraînera l'erreur « appels multiples de réponse.WriteHeader ».
Solution
Pour Pour éviter ce problème, supprimez le mot-clé "go" de la ligne qui démarre la goroutine :
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) HandleIndex(w, r) }
ou assurez-vous que l'utilisateur anonyme la fonction définit l'état de la réponse et y écrit avant de renvoyer :
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) w.Write([]byte("Hello, World!")) go HandleIndex(w, r) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!