Когда я посылаю запрос с "GET" в c++ следующим образом:
GET / HTTP/1.1\r\nHost: site.com\r\n\r\n
Я получаю правильный ответ. Но когда я настраиваю запрос в соответствии с тем, что делают браузеры (я захватил заголовки из пакетного сниффера), ответ с сервера 200 OK, но тело html является куском мусора. Также длина контента, показанная в заголовке, доказывает, что я не получил правильный html-ответ. Проблема возникает при добавлении "Accept-Encoding: gzip, deflate". Я отправляю именно то, что отправляет браузер. Но я получаю другой ответ, чем браузер. Почему вы думаете, что это происходит?
Если вы принимаете gzipped-контент, сервер может отправлять gzipped-контент. (На самом деле, некоторые багги-серверы отправляют gzipped-контент, даже если вы не говорите, что согласны с ним!)
Обратите внимание, что в возвращенных заголовках он будет включать Content-Encoding: gzip
или, возможно, deflate вместо gzip. Это говорит о кодировке. Если это gzipped, вам нужно распаковать его с помощью библиотеки zlib
.
Еще одна вещь, которую вы можете увидеть в ответах на запросы HTTP 1.1, заключается в том, что соединение не обязательно будет закрываться, когда оно будет завершено, и вы можете получить Transfer-Encoding: chunked
, который будет форматировать тело по-разному. Чанкированные ответы - это серия кусков с шестнадцатеричной длиной, а затем содержимое, заканчивающееся пустым куском. Напротив, не-chunked ответы отправляются с заголовком Content-Length
который говорит вам, сколько ожидать. Длина содержимого - это длина отправляемых данных, которая будет меньше, если данные будут сжаты.
Если вы не выполняете декомпрессию, не отправляйте Accept-Encoding
. Выделенные ответы - это то, что вам, вероятно, придется реализовать, поскольку это распространено в http 1.1, и если вы просто используете http 1.0, вы не сможете использовать важный заголовок хоста.