Heim > Backend-Entwicklung > Golang > Berücksichtigt json.NewDecoder().Decode() Kontextfristen, wenn Antwortkörper gepuffert werden?

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

Mary-Kate Olsen
Freigeben: 2024-10-30 05:25:28
Original
395 Leute haben es durchsucht

 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 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>
Nach dem Login kopieren

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!

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