2014-11-22 11 views
6

Ich verstehe nicht, warum wir Hijack verwenden, da ich etwas direkt in Antwortkörper schreiben kann, könnte jemand das erklären?Wann Hijack in Golang zu verwenden?

func writeSome(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "write some thing") 
} 

es ist die gleiche wie folgt aus:

func hijack(w http.ResponseWriter, r *http.Request) { 
    hj, _ := w.(http.Hijacker) 
    _, buf, _ := hj.Hijack() 
    buf.WriteString("write some thing") 
    buf.Flush() 
} 

Ich bin verwirrt

Antwort

3

Sie eine Bibliothek sehen (martini), die hijack eingeführt: issue 45
(Anmerkung: Ich kann nicht empfehlen Martini, which is not idiomatic, aber es wird hier nur zur Veranschaulichung erwähnt hijack)

Wäre es für Ihren responseWriter-Typ möglich, http.Hijack zu implementieren?
Dies würde Bibliotheken wie diesem websockets one ermöglichen, mit Martini zu arbeiten.

Diese Frage bezieht sich auf die following go-nuts thread, wo man versucht, die Schnittstelle http.ResponseWriter um einzubetten Statistiken wie Bytes geschrieben und Anforderungsdauer aufzuzeichnen.

Später jemand wies auf einige weitere interessante Features der http-Bibliothek aus, wie die CloseNotifier Schnittstelle, und ich erkannte, der obige Code nicht so eine gute Idee sein könnte.
Da ich eine Schnittstelle einbetten, kann ich *http.Response Implementierungen von CloseNotifier und Flusher nicht automatisch erben.

Also, wenn Sie über die ResponseWriter zu ergreifen, um möchten:

  • Rekord mehr Informationen (Status, Größe, ..., Hijack Aufruf ist wahrscheinlich übertrieben hier),
  • implementieren ein anderes Protokoll (wie websocket, die "Upgrade" eine HTTP-Server-Verbindung, calling w.(http.Hijacker))

Dann können Sie mit Hijack betrachten.
Aber, as documented, nach einem Anruf an Hijack(), die HTTP-Server-Bibliothek wird nichts anderes mit der Verbindung tun.
Es liegt in der Verantwortung des Anrufers, die Verbindung zu verwalten und zu schließen.

Wenn nicht, als Veranschaulichung in this other question, dann Hijack ist nicht interessant.

+0

Ich würde nicht vorschlagen, dass Sie Martini verwenden, weil es nicht idiomatisch ist zu Go – qwertmax

+0

@qwertmax Ich weiß, und ich habe die Antwort bearbeitet, um das klar zu machen. Sie können jetzt Ihren Downvote rückgängig machen. – VonC

+0

@qwertmax Das ist seltsam: Sie haben immer noch * nicht * zurückgesetzt Ihren Downvote. Fehlt etwas? – VonC

13

Verwenden Sie Hijack, wenn Sie die Implementierung des HTTP-Protokolls durch den integrierten Server nicht verwenden möchten. Dies liegt möglicherweise daran, dass Sie die Protokolle (z. B. zu WebSocket) wechseln möchten oder der integrierte Server sich Ihnen in den Weg stellt.

Die beiden Code-Schnipsel oben erzeugen nicht die gleiche Ausgabe auf der Leitung.Die Ausgabe aus dem ersten Schnipsel eine Antwort-Header enthalten:

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 

Der zweite Schnipsel umgeht den integrierten Server-Code und schreibt

write some thing 

direkt zum Ausgang.