我想在golang中使用劫持,而在客户端上收到无效响应

时间:2019-01-28 14:20:15

标签: go

我想在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

1 个答案:

答案 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")
})