2014-11-22 13 views
6

Nie rozumiem, dlaczego używamy hijack, ponieważ mogę napisać coś bezpośrednio do ciała odpowiedzi, czy ktoś mógłby to wyjaśnić?kiedy używać hijack w golangu?

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

jest taki sam jak ten:

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

Jestem zdezorientowany

Odpowiedz

3

można zobaczyć jedną bibliotekę (martini), która wprowadziła hijack: issue 45
(Uwaga: nie polecam Martini, which is not idiomatic, ale wspomniano tutaj tylko w celu zilustrowania hijack)

Czy Twój typ responseWriter może zaimplementować http.Hijack?
Pozwoliłoby to bibliotekom takim jak ten websockets one współpracować z martini.

Kwestia ta odnosi się do following go-nuts thread, gdzie jeden próbował osadzić interfejs http.ResponseWriter w celu rejestracji danych statystycznych, jak i czasu trwania bajtów zapisanych żądanie.

Później ktoś zwrócił uwagę na kilka innych ciekawych funkcji biblioteki HTTP, takich jak interfejs CloseNotifier, i zdałem sobie sprawę, powyższy kod może nie być taki dobry pomysł.
Odkąd osadzam interfejs , nie mogę automatycznie dziedziczyć implementacji *http.ResponseCloseNotifier i Flusher.

Tak więc, jeśli chcesz przejąć ResponseWriter w celu:

  • nagrać więcej informacji (status, wielkość, ..., nazywając hijack jest chyba przesadą tutaj),
  • wdrożenia inny protokół (jak websocket, który "Upgrade" połączenie z serwerem HTTP, calling w.(http.Hijacker))

Wtedy można rozważyć użycie hijack.
Ale, as documented, po wywołaniu do Hijack(), biblioteka serwera HTTP nie zrobi nic więcej z połączeniem.
Osoba dzwoniąca ma obowiązek zarządzać połączeniem i je zamykać.

Jeśli nie, jak ilustrując in this other question, przejęcie nie jest interesujące.

+0

Nie sugerowałbym, abyś używał Martini, ponieważ nie jest idiomatyczny Go – qwertmax

+0

@qwertmax Wiem, i zredagowałem odpowiedź, aby to wyjaśnić. Możesz teraz wycofać swoje spadki. – VonC

+0

@qwertmax To dziwne: wciąż masz * nie * przywróciłeś swoje poparcie. Czy czegoś brakuje? – VonC

13

Użyj funkcji Hijack, gdy nie chcesz używać wbudowanego serwera do implementacji protokołu HTTP. Może to wynikać z tego, że chcesz przełączyć protokoły (na przykład na WebSocket) lub wbudowany serwer wchodzi ci w drogę.

Dwa powyższe fragmenty kodu nie tworzą tego samego wyjścia na drucie.Wyjście z pierwszego fragmentu będzie zawierać nagłówek odpowiedzi:

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 

Drugi fragment omija wbudowany kod serwera i zapisuje

write some thing 

bezpośrednio do wyjścia.