процедура получения tidhttp не работает на некоторых URL - PullRequest
2 голосов
/ 12 марта 2010

Я столкнулся с проблемой в компоненте Delphi Tidhttp, из-за которой процедура GET не может извлечь определенный URL-адрес, но для других URL-адресов она работает. Пример: этот код возвращает пустой response.datastring. Response.datastring пуст только с этим error_url, но с другими URL-адресами response.datastring имеет значение. Мне нужно извлечь содержимое этого error_url, чтобы исправить эту проблему.

procedure TForm1.Button1Click(Sender: TObject);
var
  Response : TStringStream;
  error_url: string;
begin
  error_url := 'http://www.chefscatalog.com/international/home.aspx'; //error url
  Response := TStringStream.Create;
  try
    IdHTTP1.Get(error_url, Response);
    Memo1.Text := Response.DataString;
  finally
    FreeAndNil(Response);
  end;
end;

Кстати, свойство перенаправления idHTTP1 здесь установлено в значение true, поэтому перенаправление не является проблемой.

Это исключение, с которым я столкнулся: 1. http / 1.1 302 Найдено 2. EDecompressionError с сообщением «Ошибка ZLib (-3)»

Вы можете скачать исходный код (это indytest.zip) этого проекта по этой ссылке http://www.yourfilelink.com/get.php?fid=534933

Пожалуйста, помогите мне, ребята. Заранее спасибо:)

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Причина в том, что веб-сайт, на который вы пытаетесь попасть, ищет файл cookie, и, если он не устанавливается, он пытается установить его, а затем перенаправляет 302 обратно на себя.

Поскольку вы не подключили менеджер файлов cookie, вы попадаете в цикл перенаправления 302, поскольку сайт продолжает проверять файлы cookie, настраивать и затем перенаправлять.

Обрабатывайте куки-файлы, и они будут отлично работать только с одним 302.


Однако, похоже, по какой-то причине Indy игнорирует файлы cookie, отправляемые этим сайтом. Я набрал тестовый код, если набрал http://www.google.com Я получил

New cookie: PREF
New cookie: NID
Redirecting (1) to: http://www.google.co.nz/
New cookie: PREF
New cookie: NID

это заголовки, которые Google отправляет

Set-Cookie: PREF=ID=3c7e441914b902ae:TM=1268686477:LM=1268686477:S=Z-Gwqx52jK0V1rYR; expires=Wed, 14-Mar-2012 20:54:37 GMT; path=/; domain=.google.com
Set-Cookie: NID=32=vsOZvkr4AOZ7320d_OBPf2zR2jau4E6pupbOe_ZaaX4DNjahTzSV-mSA55naTk-5cXQcn7SNEp7uSxbE_cFrL9ZftGApTGZMPGKzcz3_NZE_2MYpWG5PGbwWFw9t2d_R; expires=Tue, 14-Sep-2010 20:54:37 GMT; path=/; domain=.google.com; HttpOnly

Однако для этого другого сайта я получаю это в своем отладочном выводе

Redirecting (1) to: http://www.chefscatalog.com/error.aspx?impsid=0
Redirecting (2) to: http://www.chefscatalog.com/error.aspx?impsid=0

вплоть до 15 попыток .. если мы посмотрим, какие заголовки сайт отправляет обратно

Set-Cookie: ASP.NET_SessionId=4o0bpi45evee0d45qos1uy55; path=/; HttpOnly
Set-Cookie: ChefsSite=CartID=00000000-0000-0000-0000-000000000000&cst=f4t8YpBpAAkNiRUd9BEf2luKAA%3d%3d&act=c0f2VBCSbv30F4kasnvWS5OfJQ%3d%3d&CookiesEnabled=False; expires=Wed, 14-Apr-2010 20:54:22 GMT; path=/

Я отмечаю, что на сайте отсутствует конец файла Set-Cookie, что странно, но я не думаю, что это необходимо из RFC. если мы посмотрим на методы AddCookie / 2 idCookieManager, для которых требуется хост с этим параметром, так что, возможно, он не будет работать на любых Set-Cookies, которые не дают домен.

Я проверил это еще на нескольких сайтах, и все работает нормально, если в Set-Cookie входит domain = .google.com;

Также интересно отметить, что в idHttp.OnRedirect, если вы посмотрите на

idHttp.Response.RawHeaders.Text

для сайта, который не работает, вы не видите Set-Cookies, но на сайтах, которые работают, вы видите Set-Cookies ...

Однако, если я установлю idhttp useragent на

    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1

(из другого ответа)

тогда кажется, что печенье подхватывает просто отлично

    New cookie: ASP.NET_SessionId
    New cookie: ChefsSite
    Redirecting (1) to: http://www.chefscatalog.com/international/home.aspx
    New cookie: ChefsSite

Weird.

1 голос
/ 12 марта 2010

Проверьте событие OnRedirect. По какой-то причине вы перенаправлены на страницу с ошибкой.

http://www.chefscatalog.com/error.aspx?impsid=0

Что, в свою очередь, перенаправляет вас обратно на эту же страницу с ошибкой, пока вы не исчерпаете свой RedirectMaximum (15).

Обновление:

Как только вы будете перенаправлены на страницу с ошибкой, Wizzard объясняет ниже, почему она постоянно перенаправляет обратно на одну и ту же страницу с ошибкой снова и снова. Печенье.

Причина, по которой вас перенаправляют в первую очередь, заключается в том, что сайт, вероятно, не распознает (или не любит) вашу строку агента пользователя (в свойстве Request). По умолчанию это «Mozilla / 3.0 (совместимый; Indy Library)». Измените его на текущую строку, используемую FireFox , IE или другим распознанным браузером.

Я попробовал это с "Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.1) Gecko / 20100122 firefox / 3.6.1", и, похоже, он работает нормально.

Более подробную информацию вы можете найти в Indy KB PDF .

...