Inhaltsverzeichnis
Frageninhalt
Lösung
Heim Backend-Entwicklung Golang Wenn Golang http ResponseWriter 2 KB nicht überschreitet, warum wird die Inhaltslänge dann automatisch hinzugefügt?

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

Feb 09, 2024 am 08:28 AM

如果 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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Mar 21, 2025 pm 06:37 PM

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

Wie schreibt man Unit -Tests in Go? Wie schreibt man Unit -Tests in Go? Mar 21, 2025 pm 06:34 PM

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Dieser Artikel zeigt, dass Mocks und Stubs in GO für Unit -Tests erstellen. Es betont die Verwendung von Schnittstellen, liefert Beispiele für Mock -Implementierungen und diskutiert Best Practices wie die Fokussierung von Mocks und die Verwendung von Assertion -Bibliotheken. Die Articl

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

In diesem Artikel werden die benutzerdefinierten Typ -Einschränkungen von GO für Generika untersucht. Es wird beschrieben, wie Schnittstellen die minimalen Typanforderungen für generische Funktionen definieren und die Sicherheitstypsicherheit und die Wiederverwendbarkeit von Code verbessern. Der Artikel erörtert auch Einschränkungen und Best Practices

Erläutern Sie den Zweck von Go's Reflect Package. Wann würden Sie Reflexion verwenden? Was sind die Leistungsauswirkungen? Erläutern Sie den Zweck von Go's Reflect Package. Wann würden Sie Reflexion verwenden? Was sind die Leistungsauswirkungen? Mar 25, 2025 am 11:17 AM

In dem Artikel wird das Reflect -Paket von Go, das zur Laufzeitmanipulation von Code verwendet wird, von Vorteil für die Serialisierung, generische Programmierung und vieles mehr. Es warnt vor Leistungskosten wie langsamere Ausführung und höherer Speichergebrauch, beraten die vernünftige Verwendung und am besten am besten

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

In diesem Artikel wird die Verwendung von Tracing -Tools zur Analyse von GO -Anwendungsausführungsfluss untersucht. Es werden manuelle und automatische Instrumentierungstechniken, den Vergleich von Tools wie Jaeger, Zipkin und Opentelemetrie erörtert und die effektive Datenvisualisierung hervorheben

Wie verwenden Sie tabelgesteuerte Tests in Go? Wie verwenden Sie tabelgesteuerte Tests in Go? Mar 21, 2025 pm 06:35 PM

In dem Artikel werden mit Tabellensteuerungstests in GO eine Methode mit einer Tabelle mit Testfällen getestet, um Funktionen mit mehreren Eingaben und Ergebnissen zu testen. Es zeigt Vorteile wie eine verbesserte Lesbarkeit, verringerte Vervielfältigung, Skalierbarkeit, Konsistenz und a

See all articles