我想在golang中使用劫持,同时在客户端上收到无效响应
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
答案 0 :(得分:0)
如Hijacker
的文档所述
劫持使呼叫者可以接管连接。之后 调用Hijack,HTTP服务器库将无法执行 与连接有关的其他任何内容。
管理和关闭是呼叫者的责任 连接。
返回的net.Conn可能已经设置了读写期限, 取决于服务器的配置。它是 呼叫者负责设置或清除这些截止日期 根据需要。
返回的bufio.Reader可能包含来自以下位置的未处理的缓冲数据 客户。
呼叫Hijack之后,不得使用原始的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")
})