2013-12-14 5 views
0

Когда я посылаю запрос с «GET» в C++, как это:Неверный ответ от сервера anfter GET запрос

GET/HTTP/1.1\r\nHost: site.com\r\n\r\n 

я получить правильный ответ. Но когда я настраиваю запрос в соответствии с тем, что делают браузеры (я захватил заголовки из пакетного сниффера), ответ с сервера 200 OK, но тело html является куском мусора. Также длина контента, показанная в заголовке, доказывает, что я не получил правильный html-ответ. Проблема возникает при добавлении «Accept-Encoding: gzip, deflate». Я отправляю именно то, что отправляет браузер. Но я получаю другой ответ, чем браузер. Почему вы думаете, что это происходит?

+4

Сервер отправляет обратно содержимое gzipped. Вам нужно g-разархивировать его, чтобы он был доступен для чтения. – AVP

+0

Спасибо за ответ. Но, как я сказал, поле Content-Length в заголовке ответа для браузера отличается от моего. Например, браузер получает «Content-Length: 17000», но я получаю «Content-Length: 4000». Как это возможно? – user2808671

+0

Используйте Fiddler для захвата и сравнения отправленных запросов и ответов и отправки браузера. –

ответ

2

Если вы принимаете gzipped-контент, сервер может отправлять gzip-контент. (На самом деле, некоторые багги-серверы отправляют gzip-контент, даже если вы не говорите, что согласны с ним!)

Обратите внимание, что в возвращенных заголовках он будет включать Content-Encoding: gzip или, может быть, deflate вместо gzip. Это говорит о кодировке. Если это gzipped, вам нужно распаковать его с помощью библиотеки, например, zlib.

Еще одна вещь, которую вы можете увидеть в ответах на запросы HTTP 1.1, заключается в том, что соединение не обязательно будет закрыто, когда оно будет завершено, и вы можете получить Transfer-Encoding: chunked, который будет отформатировать тело по-разному. Чанкированные ответы - это серия кусков с шестнадцатеричной длиной, а затем содержимое, заканчивающееся пустым куском. Отрицательные ответы, напротив, отправляются с заголовком , который говорит вам, сколько стоит ожидать. Длина содержимого - это длина отправляемых данных, которая будет меньше, если данные будут сжаты.

Если вы не применяете декомпрессию, не отправляйте Accept-Encoding. Выделенные ответы - это то, что вам, вероятно, придется реализовать, поскольку это распространено в http 1.1, и если вы просто используете http 1.0, вы не сможете использовать важный заголовок хоста.

Смежные вопросы