Wenn Golang http ResponseWriter 2 KB nicht überschreitet, warum wird die Inhaltslänge dann automatisch hinzugefügt?

WBOY
Freigeben: 2024-02-09 08:28:02
nach vorne
570 Leute haben es durchsucht

如果 golang http ResponseWriter 不超过 2kb,为什么会自动添加内容长度

Der PHP-Editor Xinyi beantwortet für Sie eine Frage zu Golang: Warum wird die Inhaltslänge bei der Verarbeitung einer http-Anfrage automatisch hinzugefügt, wenn der Inhalt des ResponseWriter 2 KB nicht überschreitet? Dies liegt tatsächlich daran, dass die Inhaltslänge im HTTP-Protokoll ein erforderliches Feld ist, das verwendet wird, um dem Client die Länge der zu empfangenden Daten mitzuteilen, damit er die Antwort korrekt analysieren kann. Auch wenn die Inhaltslänge gering ist, muss der Server dieses Feld dennoch bereitstellen, um einen vollständigen Kommunikationsprozess sicherzustellen. Auf diese Weise kann der Client den Inhalt korrekt empfangen und analysieren und so die Integrität und Genauigkeit von Anfragen und Antworten sicherstellen.

Frageninhalt

func (handler Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var content string
    ...
    w.Write([]byte(content))
}
Nach dem Login kopieren

Wenn len(content) <= 2048, dann content-length 将自动添加到响应中。而如果超过2048,则没有content-length,则会添加transfer-encoding: chunked.

Ich kann nicht finden, wo ich 2048 bestimmen kann.

Ich bitte um Hilfe bei der Suche nach dem Quellcode, in dem 2048 festgelegt ist.

Lösung

Werfen wir einen Blick auf die Dokumentation für diese Funktion in der http.responsewriterSchnittstelle, nur als Referenz. Klarheit:

[i] Wenn die Gesamtgröße aller geschriebenen Daten unter ein paar KB liegt und keine Flush-Aufrufe erfolgen, wird der Content-Length-Header automatisch hinzugefügt.

Erstens können wir sehen, dass die Zahl möglicherweise nicht genau 2048 (2 kb) beträgt, sondern innerhalb des „wenigen kb“-Bereichs liegt, den wir erwarten würden. Zweitens können wir sehen, dass dieses Verhalten mit der flush 方法有关,该方法记录在 flusher-Schnittstelle in übereinstimmt:

flush sendet alle gepufferten Daten an den Client.

Die Flusher-Schnittstelle wird vom Responsewriter implementiert und ermöglicht HTTP-Handlern, gepufferte Daten an den Client zu übertragen.

Die standardmäßigen http/1.x- und http/2-Responsewriter-Implementierungen unterstützen Flusher, Responsewriter-Wrapper jedoch möglicherweise nicht. Handler sollten diese Funktionalität immer zur Laufzeit testen.

Wie es heißt, löscht Ihre responsewriter 可能支持数据缓冲和刷新。这意味着当您将数据写入响应写入器时,它不会立即通过连接传输。相反,它首先被写入缓冲区。每次缓冲区太满而无法再写入时,当 servehttp 方法返回时,整个缓冲区将被传输。这可以确保即使您进行大量微小写入,数据也能有效传输,并且所有数据最终都能传输。您还可以选择使用 flush-Methode den Puffer jederzeit aktiv. HTTP-Header müssen vor den Textdaten gesendet werden, sie müssen jedoch nicht gesendet werden, bevor der Puffer zum ersten Mal geleert wird.

Wenn man das alles zusammennimmt, wird man sehen, dass es nicht automatisch ermittelt werden kann, wenn die gesamte geschriebene Menge die Puffergröße nicht überschreitet und wir nie aufrufen flush,那么在所有数据准备好之前不需要发送标头,此时点我们知道内容的长度。如果写入的总量大于缓冲区大小,则必须在知道内容长度之前发送标头,因此 responsewriter.

Dies ist unter net/http/server.gonet/http/server.go。具体来说,这里是缓冲区大小的声明,以及实现部分缓冲写入行为的 nchunkedwriter. Im Einzelnen finden Sie hier die Deklaration der Puffergröße und des nchunkedwriter, der das teilweise gepufferte Schreibverhalten implementiert:

// This should be >= 512 bytes for DetectContentType,
// but otherwise it's somewhat arbitrary.
const bufferBeforeChunkingSize = 2048

// chunkWriter writes to a response's conn buffer, and is the writer
// wrapped by the response.w buffered writer.
//
// chunkWriter also is responsible for finalizing the Header, including
// conditionally setting the Content-Type and setting a Content-Length
// in cases where the handler's final output is smaller than the buffer
// size. It also conditionally adds chunk headers, when in chunking mode.
//
// See the comment above (*response).Write for the entire write flow.
type chunkWriter struct {
Nach dem Login kopieren

Quellcode-Link für 1.19.5. Bitte beachten Sie, dass sich der Quellcode mit jeder Go-Version ändern kann.

Das obige ist der detaillierte Inhalt vonWenn Golang http ResponseWriter 2 KB nicht überschreitet, warum wird die Inhaltslänge dann automatisch hinzugefügt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!