【问题标题】:when to use hijack in golang?什么时候在 golang 中使用劫持?
【发布时间】:2014-11-22 08:25:04
【问题描述】:

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

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

我很困惑

【问题讨论】:

    标签: go go-http


    【解决方案1】:

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

    上面的两个 sn-ps 代码不会在线路上创建相同的输出。第一个 sn-p 的输出将包含一个响应头:

    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
    

    第二个sn -p绕过内置服务器代码,写

    write some thing
    

    直接输出。

    【讨论】:

      【解决方案2】:

      你可以看到一个库(martini)介绍了hijackissue 45
      (注:我不推荐马提尼,which is not idiomatic,但这里提到只是为了说明hijack

      您的 responseWriter 类型是否可以实现 http.Hijack?
      这将允许像 websockets one 这样的库与 martini 一起使用。

      该问题涉及following go-nuts thread,其中有人尝试嵌入接口http.ResponseWriter,以记录写入的字节数和请求持续时间等统计信息。

      后来有人指出了 http 库的一些其他有趣的特性,例如 CloseNotifier 接口,我意识到上面的代码可能不是一个好主意。
      由于我嵌入了一个接口,我无法自动继承*http.ResponseCloseNotifierFlusher 的实现。

      所以,如果你想接管ResponseWriter,以便:

      • 记录更多信息(状态、大小、...,在这里调用劫持可能是矫枉过正),
      • 实现另一个协议(如 websocket,其中“Upgrade”是一个 HTTP 服务器连接,calling w.(http.Hijacker)

      那么你可以考虑使用劫持。
      但是,as documented,在调用 Hijack() 之后,HTTP 服务器库不会对连接做任何其他事情。
      管理和关闭连接成为调用者的责任。

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

      【讨论】:

      • 我不建议你使用 Martini,因为 Go 不习惯
      • @qwertmax 我知道,我已经编辑了答案以明确这一点。您现在可以恢复您的反对票。
      • @qwertmax 这很奇怪:您仍然有 not 回复了您的反对票。有什么遗漏吗?
      • 链接“我对马提尼酒的看法”现在链接到 bet365 垃圾邮件,有人有原始文章吗?
      • @FelipeValdes 谢谢。我已恢复文章“我对马提尼酒的看法”的链接
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2012-07-29
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多