net/http服务器不发送100Continue除非客户端发送Transfer-Encoding:chunked或nonzeroContent-Length
我正在用 Go 编写一个 HTTP 服务器,它将接收来自带有Expect: 100-continue标头的客户端的请求。但是,HTTP/1.1 100 Continue除非客户端还发送Transfer-Encoding: Chunked标头,否则net/http 服务器似乎不会发送标头,而某些客户端(例如,带有icecast://目的地的ffmpeg )则不会。
这是一个最小的服务器,它写入一个bytes.Buffer(我已经用更复杂的服务器重现了相同的行为,例如,用于io.Copy()写入文件):
func main() {
http.HandleFunc("/", func(writer http.ResponseWriter, r *http.Request) {
log.Printf("Expect header: %vn", r.Header.Get("Expect"))
log.Printf("Transfer-Encoding header: %vn", r.Header.Get("Transfer-Encoding"))
buf := new(bytes.Buffer)
defer func() {
log.Printf("Buffer size: %dn", buf.Len())
}()
defer r.Body.Close()
log.Println("Writing.")
io.Copy(buf, r.Body)
})
log.Fatal(http.ListenAndServe(":3948", nil))
}
这是两个 HTTP 对话的抄本(通过 telnet),其中服务器在一个中发送 100 而在另一个中不发送:
PUT /telnetlol HTTP/1.1
Host: localhost
Expect: 100-continue
HTTP/1.1 200 OK
Date: Thu, 18 Mar 2021 10:59:09 GMT
Content-Length: 0
PUT /telnetlol HTTP/1.1
Host: localhost
Expect: 100-continue
Transfer-Encoding: chunked
HTTP/1.1 100 Continue
test
HTTP/1.1 200 OK
Date: Thu, 18 Mar 2021 10:59:35 GMT
Content-Length: 0
Connection: close
这是 Go 中的错误,还是我误解了 HTTP 规范?规范写道:
当接收到一个包含带有“100-continue”期望的 Expect 请求头字段的请求时,源服务器必须以 100(继续)状态响应并继续从输入流中读取,或以最终状态代码响应。源服务器不得在发送 100(继续)响应之前等待请求正文。
编辑:Content-Length在初始请求中发送非零标头也会使服务器回复100 Continue. (虽然,如果我正确理解规范,它仍然应该回复继续,不管。)
THE END
二维码