golang http ResponseWriter가 2kb를 초과하지 않는 경우 콘텐츠 길이가 자동으로 추가되는 이유는 무엇입니까?

WBOY
풀어 주다: 2024-02-09 08:28:02
앞으로
570명이 탐색했습니다.

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

PHP 편집자 Xinyi가 golang에 대한 질문에 답변해 드립니다. ResponseWriter의 콘텐츠가 2kb를 초과하지 않는 경우 http 요청을 처리할 때 콘텐츠 길이가 자동으로 추가되는 이유는 무엇입니까? 실제로 이는 HTTP 프로토콜에서 콘텐츠 길이가 필수 필드이기 때문입니다. 이는 응답을 올바르게 구문 분석하기 위해 수신할 데이터의 길이를 클라이언트에 알리는 데 사용됩니다. 콘텐츠 길이가 작더라도 서버는 완전한 통신 프로세스를 보장하기 위해 이 필드를 제공해야 합니다. 이러한 방식으로 클라이언트는 콘텐츠를 올바르게 수신하고 구문 분석하여 요청과 응답의 무결성과 정확성을 보장할 수 있습니다.

질문 내용

func (handler Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var content string
    ...
    w.Write([]byte(content))
}
로그인 후 복사

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

2048년을 어디에서 확인할 수 있는지 찾을 수 없습니다.

2048년이 결정된 소스 코드를 찾는 데 도움을 요청합니다.

Solution

참조용으로 http.responsewriter인터페이스에서 이 기능에 대한 문서를 살펴보겠습니다. 명확성:

[i] 작성된 모든 데이터의 전체 크기가 몇 kb 미만이고 플러시 호출이 없는 경우 content-length 헤더가 자동으로 추가됩니다.

먼저 숫자가 정확히 2048(2kb)이 아닐 수도 있지만 예상할 수 있는 "몇 kb" 범위 내에 있음을 알 수 있습니다. 둘째, 이 동작이 flush 方法有关,该方法记录在 flusher 인터페이스와 일치함을 알 수 있습니다.

flush는 버퍼링된 모든 데이터를 클라이언트로 보냅니다.

플러셔 인터페이스는 응답 작성기에 의해 구현되며 http 핸들러가 버퍼링된 데이터를 클라이언트로 플러시할 수 있도록 합니다.

기본 http/1.x 및 http/2 응답 작성기 구현은 플러셔를 지원하지만 응답 작성기 래퍼는 그렇지 않을 수도 있습니다. 핸들러는 항상 런타임 시 이 기능을 테스트해야 합니다.

말씀드린 대로 responsewriter 可能支持数据缓冲和刷新。这意味着当您将数据写入响应写入器时,它不会立即通过连接传输。相反,它首先被写入缓冲区。每次缓冲区太满而无法再写入时,当 servehttp 方法返回时,整个缓冲区将被传输。这可以确保即使您进行大量微小写入,数据也能有效传输,并且所有数据最终都能传输。您还可以选择使用 flush 메소드는 언제든지 버퍼를 적극적으로 지웁니다. http 헤더는 본문 데이터보다 먼저 전송되어야 하지만 버퍼가 처음 비워지기 전에는 전송될 필요가 없습니다.

이 모든 것을 종합하면 기록된 총량이 버퍼 크기를 초과하지 않고 호출하지 않으면 flush,那么在所有数据准备好之前不需要发送标头,此时点我们知道内容的长度。如果写入的总量大于缓冲区大小,则必须在知道内容长度之前发送标头,因此 responsewriter 자동으로 결정될 수 없다는 것을 알 수 있습니다.

이 위치는 net/http/server.gonet/http/server.go。具体来说,这里是缓冲区大小的声明,以及实现部分缓冲写入行为的 nchunkedwriter입니다. 특히 버퍼 크기 선언과 부분적으로 버퍼링된 쓰기 동작을 구현하는 nchunkedwriter는 다음과 같습니다.

으아악

1.19.5의 소스 코드 링크. 각 Go 버전에 따라 소스 코드가 변경될 수 있다는 점에 유의하세요.

위 내용은 golang http ResponseWriter가 2kb를 초과하지 않는 경우 콘텐츠 길이가 자동으로 추가되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!