Когда использовать угон в Голанге?

Я не понимаю, почему мы используем угон, так как я могу написать что-то напрямую в тело ответа, кто-нибудь может объяснить это?

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-сервера больше ничего не будет делать с соединением.
Ответственность за управление и закрытие соединения становится обязанностью вызывающего абонента.

Если нет, как показывает другой вопрос, угон не интересен.

Другие вопросы по тегам