是否可以将拖车头清理到客户端?

时间:2018-02-05 02:49:43

标签: go http2

这导致从服务器发送2个DATA帧:

func(w http.ResponseWriter, r *http.Request) {
    w.Write("foo")
    w.(http.Flusher).Flush()
    w.Write("bar")
    w.(http.Flusher).Flush()
}

这导致从服务器发送1个HEADERS帧:

func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Trailer:X", "a")
    w.(http.Flusher).Flush()
    w.Header().Set("Trailer:Y", "b")
    w.(http.Flusher).Flush()
}

有没有办法让拖车帧作为多个HEADERS帧发送而不使用framer api?

2 个答案:

答案 0 :(得分:0)

通常只能在将任何响应发送到客户端之前设置标头(或预告片)。发送第一个非标头数据后,将不再发送标头。

// Changing the header map after a call to WriteHeader (or
// Write) has no effect unless the modified headers are
// trailers.

https://golang.org/pkg/net/http/#ResponseWriter

答案 1 :(得分:0)

如果您只需要确保拖车被刷新到底层套接字中:

使用 ConnState 钩子表示拖车正在写入连接。 This 是写入预告片并且连接将其状态更改为 StateIdle 的时间点。

如果您想确保在单独的帧中发送预告片:

Hijack TCP 连接,手动将终止块和尾部写入连接,刷新连接,关闭连接。这(显然)与 keepalive 不兼容。