Я хочу использовать угон в Голанге, в то время как получить неверный ответ на клиенте - PullRequest
0 голосов
/ 28 января 2019

Я хочу использовать hijack в golang, получая при этом недопустимый ответ на клиенте

func hijack(w http.ResponseWriter, r *http.Request) {
    fmt.Println("start")

    hj, ok := w.(http.Hijacker)

    fmt.Println(ok)

    c, buf, err := hj.Hijack()
    if err != nil {
        panic(err)
    }
    n, err := buf.Write([]byte("hello"))
    if err != nil {
        panic(err)
    }

    fmt.Println("n == ",n)

    err = buf.Flush()
    if err != nil {
        panic(err)
    }

    fmt.Println("end")
}

, следуя напечатанному на сервере:

start

true

n ==  5

end

, но я получил следующую ошибку на клиенте

localhost отправил неверный ответ.ERR_INVALID_HTTP_RESPONSE

1 Ответ

0 голосов
/ 28 января 2019

Как сказано в документации Hijacker

Hijack позволяет вызывающему абоненту установить соединение.После вызова Hijack библиотека HTTP-сервера больше ничего не будет делать с соединением.
Ответственность за управление и закрытие соединения ложится на вызывающего.
Возвращенный net.Conn может иметь уже установленные сроки чтения или записи,в зависимости от конфигурации Сервера.Вызывающий абонент должен установить или очистить эти крайние сроки по мере необходимости.
Возвращенный bufio.Reader может содержать необработанные буферизованные данные от клиента.
После вызова Hijack, оригинальный Request.Body не должен использоваться.Исходный контекст запроса остается действительным и не отменяется до тех пор, пока метод ServeHTTP запроса не вернется.

Вам нужно писать в c, а не buf.И вам нужно написать статус ответа и заголовок Content-Length.

http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
    fmt.Println("start")

    writer.Header().Add("Content-Length", "5")
    writer.WriteHeader(200)
    hj, ok := writer.(http.Hijacker)

    fmt.Println(ok)

    c, _, err := hj.Hijack()
    if err != nil {
        panic(err)
    }
    n, err := c.Write([]byte("hello"))
    if err != nil {
        panic(err)
    }

    fmt.Println("n == ",n)

    err = c.Close()
    if err != nil {
        panic(err)
    }

    fmt.Println("end")
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...