Heim >Backend-Entwicklung >Golang >Warum verpassen HTTP-POST-Anfragen Kontextabbruchsignale in Go?
Kontextlöschungssignalverlust in HTTP-Anfragen mit Text
Bei der Entwicklung eines HTTP-Servers in Go trat ein Problem auf: der context.Done( )-Kanal konnte Client-Trennungssignale für Anfragen mit einem Textkörper nicht erfassen. Dieses Verhalten unterschied sich von GET-Anfragen, die Client-Abgänge erfolgreich erkannten.
Grundlegende Ursache
Diese Inkonsistenz ist auf die Funktionsweise des Net/http-Servers zurückzuführen. Der Verbindungsprüfmechanismus wird nur dann initiiert, wenn die Anwendung den Anforderungstext liest. Da GET-Anfragen keinen Hauptteil haben, wird die Verbindungsprüfung sofort ausgelöst, sodass der Server den Abbruch des Clients umgehend erkennen kann. Bei POST-Anfragen wartet der Server jedoch, bis der Text gelesen wurde, bevor er mit den Verbindungsprüfungen beginnt.
Lösung
Um dieses Problem zu beheben, ist es notwendig, den Text manuell zu lesen Anforderungstext, um den Verbindungsprüfungsprozess des Servers zu stimulieren. Das folgende Code-Snippet demonstriert dies:
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
Durch explizites Lesen des Anforderungstexts kann der Server Client-Trennungen sofort erkennen, auch bei Anforderungen mit einem Text. Dies ermöglicht eine ordnungsgemäße Bereinigung und Ressourcenfreigabe auf der Serverseite.
Das obige ist der detaillierte Inhalt vonWarum verpassen HTTP-POST-Anfragen Kontextabbruchsignale in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!