Когда использовать угон в Голанге?
Я не понимаю, почему мы используем угон, так как я могу написать что-то напрямую в тело ответа, кто-нибудь может объяснить это?
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()
}
я сбит с толку
2 ответа
Используйте Hijack, если вы не хотите использовать встроенный сервер для реализации протокола HTTP. Это может быть связано с тем, что вы хотите переключить протоколы (например, на 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
прямо к выходу.
Вы можете увидеть одну библиотеку ( Мартини), которая представила hijack
: выпуск 45
(Примечание: я не рекомендую Мартини, что не является идиоматическим, но упоминается здесь только для иллюстрации hijack
)
Возможно ли, чтобы ваш тип responseWriter реализовал http.Hijack?
Это позволило бы библиотекам, подобным этим, подключаться к мартини.
Эта проблема относится к следующему обсуждению, в котором пытались встроить интерфейс. http.ResponseWriter
для того, чтобы записать статистику, как записанные байты и длительность запроса
Позже кто-то указал на некоторые другие интересные функции библиотеки http, такие как
CloseNotifier
интерфейс, и я понял, что приведенный выше код может быть не очень хорошая идея.
Поскольку я встраиваю интерфейс, я не могу автоматически наследовать*http.Response
реализацийCloseNotifier
а такжеFlusher
,
Итак, если вы хотите взять на себя ResponseWriter
чтобы:
- записать больше информации (статус, размер,..., здесь, вероятно, перехват вызова),
- реализовать другой протокол (например, websocket, который "
Upgrade
"HTTP-соединение с сервером, вызовw.(http.Hijacker)
)
Тогда вы можете рассмотреть возможность использования угона.
Но, как задокументировано, после звонка Hijack()
библиотека HTTP-сервера больше ничего не будет делать с соединением.
Ответственность за управление и закрытие соединения становится обязанностью вызывающего абонента.
Если нет, как показывает другой вопрос, угон не интересен.