Go json.NewDecoder().Decode() Context Deadline Issue
In Go-Programmen bieten Kontextfristen eine Möglichkeit, Zeitüberschreitungen für 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 mithilfe von ioutil.ReadAll() wie erwartet 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
<code class="go">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")</code>
Antwort
Die Diskrepanz im Verhalten ist auf die Verwendung von Puffern innerhalb des Net/http-Pakets zurückzuführen. Abhängig von der Größe und Konfiguration der Antwort kann der Textteil vor dem Lesen teilweise oder vollständig gepuffert werden. Dies bedeutet, dass bei Verwendung von json.NewDecoder().Decode() der abgelaufene Kontext möglicherweise nicht den Zugriff auf die gepufferten Daten 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.
Fazit
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.
Das obige ist der detaillierte Inhalt vonBerücksichtigt json.NewDecoder().Decode() Kontextfristen, wenn Antwortkörper gepuffert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!