首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在高朗什么时候使用劫持?

在高朗什么时候使用劫持?
EN

Stack Overflow用户
提问于 2014-11-22 16:25:04
回答 2查看 11.2K关注 0票数 18

我不明白为什么我们使用劫持,因为我可以直接写一些东西到响应体中,有人能解释一下吗?

代码语言:javascript
运行
复制
func writeSome(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "write some thing")
}

如下所示:

代码语言:javascript
运行
复制
func hijack(w http.ResponseWriter, r *http.Request) {
    hj, _ := w.(http.Hijacker)
    _, buf, _ := hj.Hijack()
    buf.WriteString("write some thing")
    buf.Flush()
}

我很困惑

EN

回答 2

Stack Overflow用户

发布于 2014-11-26 11:39:29

当您不想使用内置服务器的HTTP协议实现时,请使用Hijack。这可能是因为您希望切换协议(例如,切换到WebSocket ),或者内置服务器妨碍了您的工作。

上面的两段代码不会在网络上创建相同的输出。第一个代码片段的输出将包含一个响应头:

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Date: Wed, 26 Nov 2014 03:37:57 GMT
Content-Length: 16
Content-Type: text/plain; charset=utf-8

write some thing

第二个代码段绕过了内置的服务器代码,并编写了

代码语言:javascript
运行
复制
write some thing

直接输出到输出。

票数 24
EN

Stack Overflow用户

发布于 2014-11-22 16:47:21

您可以看到一个引入了hijack的库(martini):issue 45

(注意:我不推荐马提尼,which is not idiomatic,但这里提到它只是为了说明hijack)

您的responseWriter类型可以实现http.Hijack吗?

这将允许像这个websockets one这样的库与马提尼一起工作。

这个问题指的是following go-nuts thread,其中有人试图嵌入接口http.ResponseWriter,以便记录诸如写入的字节和请求持续时间等统计信息。

后来有人指出了http库的其他一些有趣的特性,比如CloseNotifier接口,我意识到上面的代码可能不是一个好主意。

因为我嵌入了一个接口,所以我不能自动继承*http.ResponseCloseNotifierFlusher实现。

因此,如果您想接管ResponseWriter,以便:

  • 记录更多信息(状态,大小,...,在这里调用劫持可能是大材小用),
  • 实现了另一个协议(比如websocket,它"Upgrade“了一个HTTP服务器连接,calling w.(http.Hijacker))

然后你可以考虑使用劫持。

但是,在调用Hijack()之后,as documented服务器库不会对该连接执行任何其他操作。

管理和关闭连接成为调用者的责任。

如果不是,如in this other question所示,那么hijack就没什么意思了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27075478

复制
相关文章

相似问题

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