Неправильный ответ от сервера после GET-запроса

0

Когда я посылаю запрос с "GET" в c++ следующим образом:

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

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

  • 4
    Сервер отправляет обратно сжатый контент. Вам нужно распаковать его, чтобы он был читабельным.
  • 0
    Спасибо за ответ. Но, как я уже сказал, поле «Content-Length» в заголовке ответа для браузера отличается от моего. Например, браузер получает «Content-Length: 17000», но я получаю «Content-Length: 4000». Как это возможно?
Показать ещё 4 комментария
Теги:

1 ответ

2
Лучший ответ

Если вы принимаете 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, вы не сможете использовать важный заголовок хоста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню