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

Warum verpassen HTTP-POST-Anfragen Kontextabbruchsignale in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-19 15:21:10244Durchsuche

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:])
}

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!

Stellungnahme:
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