2014-11-22 13 views
6

Non capisco perché usiamo il dirottamento, dal momento che posso scrivere qualcosa direttamente nel corpo della risposta, qualcuno potrebbe spiegarlo?quando usare il dirottamento in golang?

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

è uguale a questo:

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

Sono confuso

risposta

3

Si può vedere una libreria (martini) che ha introdotto hijack: issue 45
(Nota: Non consiglio Martini, which is not idiomatic, ma è menzionato qui solo per illustrare hijack)

Sarebbe possibile che il tuo tipo responseWriter implementasse http.Hijack?
Ciò consentirebbe alle librerie come questa websockets one di funzionare con martini.

Tale questione si riferisce alla following go-nuts thread, dove si cercava di incorporare l'interfaccia http.ResponseWriter per registrare le statistiche come byte scritti e la durata richiesta.

Più tardi qualcuno rilevare alcune altre caratteristiche interessanti della biblioteca http, come ad esempio l'interfaccia CloseNotifier, e ho capito il codice di cui sopra potrebbe non essere una buona idea.
Poiché sto incorporando un'interfaccia , non è possibile ereditare automaticamente le implementazioni di di CloseNotifier e Flusher.

Quindi, se si vuole prendere in consegna il ResponseWriter al fine di:

  • registrare ulteriori informazioni (stato, dimensione, ..., chiamando dirottamento è probabilmente eccessivo qui),
  • implementare un altro protocollo (come websocket, che "Upgrade" una connessione server HTTP, calling w.(http.Hijacker))

Poi si può considerare l'utilizzo di dirottamento.
Ma, as documented, dopo una chiamata a Hijack(), la libreria del server HTTP non farà altro con la connessione.
Diventa responsabilità del chiamante gestire e chiudere la connessione.

In caso contrario, come illustrato in in this other question, il dirottamento non è interessante.

+0

Non ti suggerirei di utilizzare Martini perché non è un idioma di Go – qwertmax

+0

@qwertmax lo so, e ho modificato la risposta per rendere chiaro. Ora puoi ripristinare il tuo downvote. – VonC

+0

@qwertmax Che strano: hai ancora * non * ripristinato il tuo downvote. C'è qualcosa che manca? – VonC

13

Utilizzare Hijack quando non si desidera utilizzare l'implementazione del protocollo HTTP del server incorporato. Ciò potrebbe essere dovuto al fatto che si desidera passare da un protocollo all'altro (ad esempio a WebSocket) o che il server integrato si sta intromettendo.

I due frammenti di codice sopra non creano la stessa uscita sul filo.L'uscita dal primo frammento comprende un'intestazione di risposta:

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 

Il secondo frammento di bypassa il codice server incorporato e scrive

write some thing 

direttamente all'uscita.