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.
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