什么时候在 golang 中使用劫持?

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


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()

}

我很迷惑


HUH函数
浏览 227回答 2
2回答

UYOU

当您不想使用内置服务器的 HTTP 协议实现时,请使用 Hijack。这可能是因为您想切换协议(例如,切换到 WebSocket)或内置服务器妨碍了您的工作。上面的两个代码片段不会在线路上创建相同的输出。第一个片段的输出将包含一个响应头:HTTP/1.1 200 OKDate: Wed, 26 Nov 2014 03:37:57 GMTContent-Length: 16Content-Type: text/plain; charset=utf-8write some thing第二个片段绕过内置服务器代码并写入write some thing直接输出。

杨魅力

你可以看到一个库(martini),它引入了hijack:issue 45(注意:我不推荐 Martini,它不是惯用的,但这里提到它只是为了说明hijack)您的 responseWriter 类型是否可以实现 http.Hijack?这将允许像这个websockets one这样的库与 martini 一起使用。该问题涉及以下 go-nuts thread,其中有人试图嵌入接口http.ResponseWriter以记录写入的字节数和请求持续时间等统计信息。后来有人指出了 http 库的其他一些有趣的特性,比如CloseNotifier接口,我意识到上面的代码可能不是一个好主意。因为我嵌入了一个interface,所以我不能自动继承and*http.Response的实现。CloseNotifierFlusher因此,如果您想接管ResponseWriter以便:记录更多信息(状态,大小,...,在这里调用劫持可能有点矫枉过正),实现另一个协议(如 websocket,它“ Upgrade”一个 HTTP 服务器连接,调用w.(http.Hijacker))那么你可以考虑使用劫持。但是,正如所记录的,在调用 之后Hijack(),HTTP 服务器库不会对连接执行任何其他操作。管理和关闭连接成为调用者的责任。如果不是,正如在另一个问题中所说明的那样,那么劫持就不有趣了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go