【发布时间】:2021-11-19 04:38:04
【问题描述】:
我正在创建一个测试 Go HTTP 服务器,并且我正在发送一个 Transfer-Encoding: 分块的响应标头,因此我可以在检索新数据时不断发送新数据。该服务器应该每秒向该服务器写入一个块。客户应该能够按需接收它们。
不幸的是,客户端(在本例中为 curl)在持续时间结束时(5 秒)接收所有块,而不是每秒接收一个块。此外,Go 似乎为我发送了 Content-Length。我想在最后发送 Content-Length,并且我希望标头的值为 0。
这是服务器代码:
package main
import (
"fmt"
"io"
"log"
"net/http"
"time"
)
func main() {
http.HandleFunc("/test", HandlePost);
log.Fatal(http.ListenAndServe(":8080", nil))
}
func HandlePost(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Connection", "Keep-Alive")
w.Header().Set("Transfer-Encoding", "chunked")
w.Header().Set("X-Content-Type-Options", "nosniff")
ticker := time.NewTicker(time.Second)
go func() {
for t := range ticker.C {
io.WriteString(w, "Chunk")
fmt.Println("Tick at", t)
}
}()
time.Sleep(time.Second * 5)
ticker.Stop()
fmt.Println("Finished: should return Content-Length: 0 here")
w.Header().Set("Content-Length", "0")
}
【问题讨论】:
-
Go 团队的 Andrew Gerrand 前几天发布了类似的内容...我会尽力为您找到。
-
抱歉,它不太一样 - 它来自请求的客户端。不过,您可能会从中学到一些东西:github.com/nf/dl/blob/master/dl.go
-
未来读者:如果这对你不起作用,我犯的错误是使用
w.WriteHeader()before 设置Connection: Keep-Alive和Transfer-Encoding: chunked标头。使用w.WriteHeader()推送标头,之后您将无法再设置其他标头,因此客户端永远不会获取Connection: Keep-Alive和Transfer-Encoding: chunked标头并处理响应作为未分块
标签: go