2014-11-22 87 views
6

我不明白我们为什么要使用劫持,因为我可以直接在响应中写入内容,任何人都可以解释这一点吗?何时在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() 
} 

我很困惑

回答

3

你可以看到一个库(martini),它引入了hijackissue 45
(注:我不推荐马提尼,which is not idiomatic,但这里只提到hijack

您的responseWriter类型可以实现http.Hijack吗?
这将允许像这样的图书馆websockets one与马提尼一起工作。

这个问题指的是following go-nuts thread,其中一个试图嵌入接口http.ResponseWriter为了记录像写入的字节,并要求持续时间统计。

后来有人指出http库的一些其他有趣的功能,比如CloseNotifier接口,并且我意识到上面的代码可能不是一个好主意。
由于我嵌入了接口,因此我无法自动继承和Flusher*http.Response的实现。

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

  • 记录的详细信息(状态,大小,...,呼吁劫持可能是矫枉过正这里),
  • 实施另一种协议(例如网页套接字,其中“Upgrade”的HTTP服务器连接,calling w.(http.Hijacker)

然后,可以考虑使用劫持。
但是,as documentedHijack()的调用之后,HTTP服务器库不会对连接执行任何操作。
管理和关闭连接成为调用者的责任。

如果不是,如图所示in this other question,那么劫持并不重要。

+0

我不会建议你使用马提尼,因为它不是惯用的去 – qwertmax 2015-12-16 20:32:47

+0

@qwertmax我知道了,我已经编辑了答案来说明清楚。你现在可以恢复你的downvote。 – VonC 2015-12-16 20:36:00

+0

@qwertmax这很奇怪:你仍然* *没有*恢复你的downvote。有什么遗漏吗? – VonC 2015-12-17 14:53:54

13

当您不想使用内置服务器的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 

到输出。