„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Berücksichtigt json.NewDecoder().Decode() Kontextfristen, wenn Antwortkörper gepuffert werden?

Berücksichtigt json.NewDecoder().Decode() Kontextfristen, wenn Antwortkörper gepuffert werden?

Veröffentlicht am 02.11.2024
Durchsuche:360

 Does json.NewDecoder().Decode() Respect Context Deadlines When Response Bodies are Buffered?

Go json.NewDecoder().Decode() Context Deadline Issue

In Go-Programmen bieten Kontextfristen eine Möglichkeit, Zeitüberschreitungen festzulegen bestimmte Operationen. Ein Benutzer hat jedoch ein unerwartetes Verhalten bei der Verwendung von json.NewDecoder().Decode() gemeldet.

Benutzerbedenken

Der Benutzer hat json.NewDecoder() erwartet. Decode(), um die für das Programm festgelegte Kontextfrist einzuhalten. Sie stellten fest, dass das Lesen aus dem Antworttext mit ioutil.ReadAll() erwartungsgemäß einen Fehler bei der Überschreitung der Kontextfrist auslöste. Als sie jedoch zu json.NewDecoder().Decode() wechselten, wurde kein Fehler gemeldet, obwohl die verstrichene Zeit die Frist überschritten hatte.

Codebeispiel

ctx, _ := context.WithTimeout(context.Background(), time.Second*5)

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
...

time.Sleep(time.Second * 6)
fmt.Println("before reading response body, context error is:", ctx.Err())
err = json.NewDecoder(resp.Body).Decode(ipResponse)
if err != nil {
    panic(err)
}
fmt.Println("Expected panic but there was none")

Antwort

Die Diskrepanz im Verhalten ergibt sich aus der Verwendung von Puffern innerhalb des Net/http-Pakets. Abhängig von der Größe und Konfiguration der Antwort kann der Textteil vor dem Lesen teilweise oder vollständig gepuffert werden. Das bedeutet, dass bei Verwendung von json.NewDecoder().Decode() der abgelaufene Kontext den Zugriff auf die gepufferten Daten möglicherweise nicht verhindert.

Um dies zu veranschaulichen, wurde ein Testserver erstellt, der den Antworttext absichtlich verzögerte . Es simulierte das teilweise Pufferungsverhalten des net/http-Pakets. Als readDoesntFail() mit diesem Testserver ausgeführt wurde, wurde tatsächlich der Fehler „Erwartete Kontextfrist überschritten“ ausgelöst.

Schlussfolgerung

Das im Code des Benutzers beobachtete Verhalten verdeutlicht das Potenzial Vorbehalte bei der Verwendung von json.NewDecoder().Decode() mit Kontextfristen. Es ist wichtig zu wissen, dass die Kontextfrist möglicherweise nicht wie erwartet eingehalten wird, wenn der Antworttext groß ist und vollständig gepuffert wurde.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3