我不明白为什么我们使用劫持,因为我可以直接在响应体中写一些东西,有人可以解释一下吗?
func writeSome(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "write some thing")
}
Run Code Online (Sandbox Code Playgroud)
它与此相同:
func hijack(w http.ResponseWriter, r *http.Request) {
hj, _ := w.(http.Hijacker)
_, buf, _ := hj.Hijack()
buf.WriteString("write some thing")
buf.Flush()
}
Run Code Online (Sandbox Code Playgroud)
我很迷惑
Mix*_*els 19
当您不想使用内置服务器的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
Run Code Online (Sandbox Code Playgroud)
第二个代码段绕过内置服务器代码并写入
write some thing
Run Code Online (Sandbox Code Playgroud)
直接输出.
你可以看到一个库(martini),它引入了hijack
:issue 45
(注意:我不推荐 Martini,它不是惯用的,但这里提到它只是为了说明hijack
)
您的 responseWriter 类型是否可以实现 http.Hijack?
这将允许像这个websockets one这样的库与 martini 一起使用。
该问题涉及以下 go-nuts 线程,其中有人试图嵌入接口http.ResponseWriter
以记录写入的字节数和请求持续时间等统计信息。
后来有人指出了 http 库的其他一些有趣的特性,比如
CloseNotifier
接口,我意识到上面的代码可能不是一个好主意。
因为我嵌入了一个interface,所以我不能自动继承and*http.Response
的实现。CloseNotifier
Flusher
因此,如果您想接管ResponseWriter
以便:
Upgrade
”一个 HTTP 服务器连接,调用w.(http.Hijacker)
)那么你可以考虑使用劫持。
但是,正如所记录的,在调用 之后Hijack()
,HTTP 服务器库不会对连接执行任何其他操作。
管理和关闭连接成为调用者的责任。
如果不是,正如在另一个问题中所说明的那样,那么劫持就不有趣了。
归档时间: |
|
查看次数: |
7365 次 |
最近记录: |