Golang: объяснение DumpRequest и DumpResponse HTTP/2

clientt := &http.Client{
    Timeout: 30 * time.Second,
}
var tr = &http2.Transport{}
clientt.Transport = tr

Я создаю клиент и отправляю запрос http/2. с транспортом http2, но в DumpRequest я вижу хост GET / HTTP/1.1: www.xxxxq23.com

В ответном дампе вижу HTTP/2.0

Зачем запрашивать использование HTTP/1.1? Как перейти на HTTP/2.0


person Alex    schedule 18.10.2020    source источник


Ответы (1)


HTTP/2 является двоичным, а не текстовым, и дамп в двоичном виде был бы нечитаемым и бесполезным. Это сделано намеренно и хорошо задокументировано:

DumpRequest возвращает данный запрос в его проводном представлении HTTP/1.x. Он должен использоваться только серверами для отладки клиентских запросов. Возвращаемое представление является приблизительным; некоторые детали первоначального запроса теряются при анализе его в http.Request. В частности, теряется порядок и регистр имен полей заголовков. Порядок значений в многозначных заголовках сохраняется. Запросы HTTP/2 выгружаются в форме HTTP/1.x, а не в исходном двоичном представлении.

Если body равно true, DumpRequest также возвращает тело. Для этого он использует req.Body, а затем заменяет его новым io.ReadCloser, который дает те же байты. Если DumpRequest возвращает ошибку, состояние req не определено.

Вы можете проверить детали реализации здесь

person 1218985    schedule 20.10.2020