我想在戈朗使用劫持,同时在客户端收到无效的响应。
func hijack(w http.ResponseWriter, r *http.Request) {
fmt.Println("start")
hj, ok := w.(http.Hijacker)
fmt.Println(ok)
c, buf, err := hj.Hijack()
if err != nil {
panic(err)
}
n, err := buf.Write([]byte("hello"))
if err != nil {
panic(err)
}
fmt.Println("n == ",n)
err = buf.Flush()
if err != nil {
panic(err)
}
fmt.Println("end")
}按照服务器上的打印:
start
true
n == 5
end但是我发现了客户端的错误
localhost发送了无效的响应。ERR_INVALID_HTTP_RESPONSE
发布于 2019-01-28 14:54:10
正如Hijacker的文档所述
劫持让来电者接管连接。在调用Hijack之后,HTTP服务器库将不会对连接执行任何其他操作。 管理和关闭连接成为调用方的责任。 返回的net.Conn可能已经设置了读写截止日期,这取决于服务器的配置。根据需要设定或清除这些截止日期是来电者的责任。 返回的bufio.Reader可能包含来自客户端的未经处理的缓冲数据。 调用劫持后,不能使用原始的Request.Body。原始请求的上下文仍然有效,并且在请求的ServeHTTP方法返回之前不会被取消。
您需要写到c,而不是buf。您需要编写响应状态和Content-Length头。
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
fmt.Println("start")
writer.Header().Add("Content-Length", "5")
writer.WriteHeader(200)
hj, ok := writer.(http.Hijacker)
fmt.Println(ok)
c, _, err := hj.Hijack()
if err != nil {
panic(err)
}
n, err := c.Write([]byte("hello"))
if err != nil {
panic(err)
}
fmt.Println("n == ",n)
err = c.Close()
if err != nil {
panic(err)
}
fmt.Println("end")
})https://stackoverflow.com/questions/54403928
复制相似问题