Go http 客户端不会自动分块 body
Go http client doesn't automatically dechunk body
我正在从 Go 流式传输 http,服务器按预期响应 "Transfer-Encoding: chunked"。我被告知 Go 中的 http 客户端会自动从 http 响应中分离 body,移除 \r\n。但在我的情况下,它不会自动删除,所以我必须使用 ChunkedReader 来读取主体。
知道为什么 golang 不自动分解我的 body 吗?
编辑:
这是 http 请求:
var transport = http.Transport{
Proxy: nil,
ExpectContinueTimeout: 0,
MaxResponseHeaderBytes: 16384}
var httpClient = http.Client{
Transport: &transport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
}}
bodyReader, bodyWriter := io.Pipe()
req, _ := http.NewRequest("GET", "http://x.x.x.x/stream", bodyReader)
response, err := httpClient.Do(req)
buffer := make([]byte, 2 << 15)
n, readErr = response.Body.Read(buffer) <-- should be dechunked body
读入缓冲区的数据未分块。知道为什么吗?
我弄明白了为什么 body 没有自动分块。这是因为 HTTP 响应是 HTTP/1.0。在这种情况下,golang 会忽略传输编码 header.
我正在从 Go 流式传输 http,服务器按预期响应 "Transfer-Encoding: chunked"。我被告知 Go 中的 http 客户端会自动从 http 响应中分离 body,移除 \r\n。但在我的情况下,它不会自动删除,所以我必须使用 ChunkedReader 来读取主体。
知道为什么 golang 不自动分解我的 body 吗?
编辑: 这是 http 请求:
var transport = http.Transport{
Proxy: nil,
ExpectContinueTimeout: 0,
MaxResponseHeaderBytes: 16384}
var httpClient = http.Client{
Transport: &transport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
}}
bodyReader, bodyWriter := io.Pipe()
req, _ := http.NewRequest("GET", "http://x.x.x.x/stream", bodyReader)
response, err := httpClient.Do(req)
buffer := make([]byte, 2 << 15)
n, readErr = response.Body.Read(buffer) <-- should be dechunked body
读入缓冲区的数据未分块。知道为什么吗?
我弄明白了为什么 body 没有自动分块。这是因为 HTTP 响应是 HTTP/1.0。在这种情况下,golang 会忽略传输编码 header.