С++ HTTP всегда 301 с использованием сокетов

Я устал от этого. ВСЕГДА, когда я делаю HTTP-запрос GET из программы C/C++, используя простые сокеты, я получаю 301 Moved Permanently's. Обычно я бы использовал libcURL, но в этом случае я не хочу добавлять еще одну библиотеку, мне просто нужно загрузить один плоский идентификационный файл с одного фиксированного сервера.

Это мой текущий запрос:

GET /game/getversion.jsp?user=nightcracker&password=yeahright&version=12 HTTP/1.1\r\n
Connection: close\r\n
Host: www.minecraft.net\r\n
Accept-Encoding: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n
\r\n

Я перепробовал ВСЕ, и на все просто ответил это забавное сообщение:

HTTP/1.1 301 Moved Permanently
Server: nginx/0.6.32
Date: Tue, 15 Mar 2011 02:18:11 GMT
Content-Type: text/html
Content-Length: 185
Connection: close
Location: http://www.minecraft.net/game/getversion.jsp?user=nightcracker&password=yeahright&version=12

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/0.6.32</center>
</body>
</html>

Я помню эту проблему раньше, и я ушел раньше. Теперь я хочу починить этот проклятый глюк. Итак, скажите мне ТАК, почему все мои HTTP-запросы всегда возвращают 301?


person orlp    schedule 15.03.2011    source источник


Ответы (5)


Хорошо, кроме проблемы с Accept-Encoding, запрос был в порядке. Проблема заключалась в том, что я разрешил в своем коде сокета «minecraft.net» вместо «www.minecraft.net». РААААА. Исправлено.

person orlp    schedule 15.03.2011

Я не вижу ничего явно неправильного, так как перенаправленный URI выглядит таким же, как исходный URI запроса GET, поэтому я бы предложил загрузить завиток из командной строки и запустить его в подробном режиме для той же цели. Возможно, на выходе он покажет что-то, что укажет вам правильное направление. Есть шанс, что это плохо сконфигурированный сервер или плохо написанный JSP, так что имейте это в виду.

person Brian Kelly    schedule 15.03.2011

Я не знаю, проблема ли это у вас на сервере Minecraft (у меня нет учетной записи), но

Accept-Encoding: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n

что это за фигня? Поля заголовка, которые могут быть включены в запросы, включают

  • Accept: типы MIME (например, что у вас есть)
  • Accept-Charset: кодировки (например, utf-8)
  • Accept-Encoding: кодировки (например, gzip)
  • Accept-Language: языков (например, en)

а вы как будто их путаете.

person ephemient    schedule 15.03.2011
comment
Изменение Accept-Encoding на Accept ничего не исправляет, хотя это было неправильно. - person orlp; 15.03.2011

Ну, сервер перенаправляет клиента в другое место. Вам просто нужно отправить еще один запрос на URL-адрес, возвращающийся в заголовке «Местоположение» ответа 3xx.

ООП поняли, что место перенаправления совпадает с исходным URI. Этот URL работает из браузера? Если это так, вы можете попробовать добавить заголовок User-Agent в запрос, который содержит тот же User-Agent, который отправляет браузер.

person feroze    schedule 15.03.2011

Вы можете либо указать правильный URL-адрес (www.minecraft.net), либо указать libcurl автоматически следовать перенаправлениям:

curl_easy_setopt(curl_handle,CURLOPT_FOLLOWLOCATION,1);
person Imed    schedule 13.02.2021