为何Golang HTTP ResponseWriter自动添加2KB阈值的Content-Length?求源码位置
找到Go HTTP响应2048字节阈值的源码位置
你贴的这段处理HTTP请求的代码:
func (handler Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { var content string ... w.Write([]byte(content)) }
你观察到的这个2048字节的阈值,根源在Go标准库net/http包的内部定义里,具体是server.go文件中的defaultBufSize常量:
const defaultBufSize = 2048
当你调用w.Write()时,HTTP包的默认响应写入器(底层是response结构体,实现了http.ResponseWriter接口)会先把内容写入这个大小为2048的缓冲区:
- 如果写入的内容总长度≤2048,缓冲区能完全容纳,服务器会在响应结束时计算出完整的内容长度,自动添加
Content-Length头,再一次性发送缓冲区里的内容; - 一旦内容超过2048,缓冲区会被填满并触发刷新操作,这时服务器就会自动切换到分块编码模式,添加
Transfer-Encoding: chunked头,不再计算总长度,而是分块发送后续内容。
这个常量是HTTP包内部用来平衡小型响应的性能(避免分块带来的额外开销)和内存占用的默认配置。
内容的提问来源于stack exchange,提问作者zealllot
相关产品推荐
相关产品推荐

