Go net / http Transport Accept-Encoding: gzip не запрашивает закодированный ответ - PullRequest
0 голосов
/ 01 декабря 2019

Возможно, связано с Go: обнаружение кодировки gzip для ручной распаковки ответа, но отсутствует заголовок «Content-Encoding»

Я понимаю, что net / http Transport добавит Accept-Encoding: gzip кrequest, если DisableCompression не установлен в True, и это необходимо, если я хочу, чтобы он автоматически распаковывал сжатый ответ. В этом случае следующий код не получает заголовок Content-Encoding: gzip:
https://play.golang.org/p/FWs5uG9pZEL (примечание: не будет работать на игровой площадке из-за сетевых ограничений)

Если я запускаюлокальный сервер и запустить приведенный выше код с ним я вижу ожидаемый отправляемый заголовок:

GET / HTTP/1.1
Host: localhost:5555
User-Agent: Go-http-client/1.1
Accept-Encoding: gzip

Есть ли что-то еще в соединении, которое создает go, которое заставляет сервер не возвращать gzipped ответ?

1 Ответ

2 голосов
/ 01 декабря 2019

Accept-Encoding: gzip означает только то, что клиент может и готов обрабатывать сжатый gzip-контент. Это не означает, что сервер должен фактически сжимать содержимое . Фактически, например, с изображениями не имеет смысла сжимать содержимое с помощью gzip, потому что это уже сжатые данные (но не с помощью gzip), а добавление gzip сверху может фактически увеличить размер полезной нагрузки.

Если вы хотите, чтобы ваш сервер возвращал сжатый контент, вам действительно нужно настроить сервер для этого. См., Например, здесь о том, как это сделать с помощью nginx.

Обратите внимание, что http.Response прозрачно распакует ответ и обновит заголовок соответственно удалите Content-Encoding. Это означает, что вы не получите исходный заголовок ответа при проверке с помощью resp.Header.Get("Content-Encoding"). Если ответ был автоматически распакован, его можно увидеть в поле Uncompressed:

fmt.Println("was compressed ", resp.Uncompressed)

Подробнее см. go doc http.Response:

// Uncompressed reports whether the response was sent compressed but
// was decompressed by the http package. When true, reading from
// Body yields the uncompressed content instead of the compressed
// content actually set from the server, ContentLength is set to -1,
// and the "Content-Length" and "Content-Encoding" fields are deleted
// from the responseHeader. To get the original response from
// the server, set Transport.DisableCompression to true.
Uncompressed bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...