我不明白为什么我们使用劫持,因为我可以直接写一些东西到响应体中,有人能解释一下吗?
func writeSome(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "write some thing")
}如下所示:
func hijack(w http.ResponseWriter, r *http.Request) {
hj, _ := w.(http.Hijacker)
_, buf, _ := hj.Hijack()
buf.WriteString("write some thing")
buf.Flush()
}我很困惑
发布于 2014-11-26 11:39:29
当您不想使用内置服务器的HTTP协议实现时,请使用Hijack。这可能是因为您希望切换协议(例如,切换到WebSocket ),或者内置服务器妨碍了您的工作。
上面的两段代码不会在网络上创建相同的输出。第一个代码片段的输出将包含一个响应头:
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第二个代码段绕过了内置的服务器代码,并编写了
write some thing直接输出到输出。
发布于 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.Response的CloseNotifier和Flusher实现。
因此,如果您想接管ResponseWriter,以便:
Upgrade“了一个HTTP服务器连接,calling w.(http.Hijacker))然后你可以考虑使用劫持。
但是,在调用Hijack()之后,as documented服务器库不会对该连接执行任何其他操作。
管理和关闭连接成为调用者的责任。
如果不是,如in this other question所示,那么hijack就没什么意思了。
https://stackoverflow.com/questions/27075478
复制相似问题