首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我想在golang中使用hijack,而在客户端得到无效的响应。

我想在golang中使用hijack,而在客户端得到无效的响应。
EN

Stack Overflow用户
提问于 2019-01-28 14:20:14
回答 1查看 624关注 0票数 0

我想在戈朗使用劫持,同时在客户端收到无效的响应。

代码语言:javascript
运行
复制
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")
}

按照服务器上的打印:

代码语言:javascript
运行
复制
start

true

n ==  5

end

但是我发现了客户端的错误

localhost发送了无效的响应。ERR_INVALID_HTTP_RESPONSE

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-28 14:54:10

正如Hijacker的文档所述

劫持让来电者接管连接。在调用Hijack之后,HTTP服务器库将不会对连接执行任何其他操作。 管理和关闭连接成为调用方的责任。 返回的net.Conn可能已经设置了读写截止日期,这取决于服务器的配置。根据需要设定或清除这些截止日期是来电者的责任。 返回的bufio.Reader可能包含来自客户端的未经处理的缓冲数据。 调用劫持后,不能使用原始的Request.Body。原始请求的上下文仍然有效,并且在请求的ServeHTTP方法返回之前不会被取消。

您需要写到c,而不是buf。您需要编写响应状态和Content-Length头。

代码语言:javascript
运行
复制
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")
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54403928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档