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()
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!