Heim > Backend-Entwicklung > Golang > Warum respektiert „json.NewDecoder().Decode()' HTTP-Kontextfristen nicht?

Warum respektiert „json.NewDecoder().Decode()' HTTP-Kontextfristen nicht?

Mary-Kate Olsen
Freigeben: 2024-10-29 09:34:29
Original
768 Leute haben es durchsucht

Why doesn't `json.NewDecoder().Decode()` respect HTTP Context Deadlines?

HTTP-Kontextfrist von json.NewDecoder().Decode() ignoriert

Frage:

Wenn context.WithTimeout zum Festlegen eines Zeitlimits für eine HTTP-Anfrage verwendet wird, unterbricht die Methode ioutil.ReadAll die Anfrage und gibt einen entsprechenden Fehler zurück, wenn das Zeitlimit überschritten wird. Allerdings scheint json.NewDecoder(resp.Body).Decode die Frist zu missachten und einen Null-Fehler anstelle von context.DeadlineExceeded zurückzugeben. Ist das ein Fehler?

Antwort:

Nein, das ist kein Fehler. Das net/http-Paket nutzt Puffer zur Verarbeitung von Anfragen, was dazu führen kann, dass der Antworttext teilweise oder vollständig in Puffer eingelesen wird, bevor das Programm ihn liest. Folglich hindert ein ablaufender Kontext das Programm nicht unbedingt daran, den Lesevorgang abzuschließen.

Beispiel:

Stellen Sie sich einen modifizierten HTTP-Testserver vor, der Antworten absichtlich verzögert. Bei Verwendung von readDoesntFail sendet der Server eine Teilantwort (10 Bytes), leert sie und wartet 6 Sekunden, bevor er den Rest sendet.

ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    s := []byte(`{"ip":"12.34.56.78"}`)
    w.Write(s[:10])
    if f, ok := w.(http.Flusher); ok {
        f.Flush()
    }
    time.Sleep(time.Second * 6)
    w.Write(s[10:])}))
defer ts.Close()
Nach dem Login kopieren

In diesem Szenario versucht json.Decoder.Decode() zu lesen von der Verbindung, da die Daten noch nicht zwischengespeichert sind. Sobald der Kontext abläuft, löst weiteres Lesen aus der Verbindung einen context.DeadlineExceeded-Fehler aus.

Schlussfolgerung:

json.Decoder.Decode() respektiert die Kontextfrist, wenn Daten sind noch nicht zwischengespeichert. Wenn die Daten jedoch teilweise oder vollständig gepuffert sind, hindert die Kontextfrist das Programm möglicherweise nicht daran, den Lesevorgang abzuschließen. Es wird empfohlen, ioutil.ReadAll oder einen ähnlichen Ansatz für ein konsistenteres Verhalten mit Kontextfristen zu verwenden.

Das obige ist der detaillierte Inhalt vonWarum respektiert „json.NewDecoder().Decode()' HTTP-Kontextfristen nicht?. 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