Heim > Backend-Entwicklung > Golang > Warum verpassen HTTP-POST-Anfragen Kontextabbruchsignale in Go?

Warum verpassen HTTP-POST-Anfragen Kontextabbruchsignale in Go?

Mary-Kate Olsen
Freigeben: 2024-12-19 15:21:10
Original
245 Leute haben es durchsucht

Why Do HTTP POST Requests Miss Context Cancellation Signals 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:])
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage