Дабы не плодить кучу тем по моим вопросам, задам вопрос тут. Есть 1 функция и одна процедура. Обе взаимосвязанны. Называются Get и Redirect. Думаю человек, знающий протокол
HTTP поймет, что за функции. Допустим при выполнении функции
GET произошло 2 редиректа. Как сделать так, что бы функция GET закончила свое выполнение, до тех пор, пока все редиректы не закончатся? т.е. вернула страницу конечного редиректа. В моем же случае функция
GET возврщает код 1й страницы, а нужно той страницы, на которую произошла переадресация. Получается так, что функция get работает дальше и грузит все страницы, но в том коде, в котором она выполняется она отдала код 1й страницы и все. Привожу коды обеих процедур:
Код:
// ---- Обрабатываем перенаправление ----
procedure THTTPCli.Redirect(const AData, AHost: string);
var
Location : string;
begin
Location := AData;
Location := Copy(Location, Pos('Location:', Location) +10, Length(Location));
Delete(Location, Pos(#13, Location), Length(Location));
// Проверка локаций и исправление
If Location[1] = '/' Then Get(AHost + Location);
If (Location[1] <> '/') And (Pos('http://', location) = 0) Then
begin
Location := '/' + Location;
Get('http://' + AHost + Location);
end;
If Pos('http://', Location) <> 0 then
begin
Location := Copy(Location, Length(GetHost(Location)) +8, Length(Location));
Get(Location);
end;
end;
// ---- Отправка GET-запроса ---- ;overload
function THTTPCli.Get(const AURL: string): string;
var
Head : string;
Host : string;
urlObj : string;
begin
{ Парсим url }
urlObj := AURL;
urlObj := Copy(urlObj, Length(GetHost(urlObj)) +8, Length(urlObj));
Host := GetHost(AURL);
// Составляем заголовок без куков
Head := 'GET ' + urlObj + ' HTTP/1.1' + crlf +
'User-Agent: Mozilla/4.8 [en](Windows NT 5.0; U)' + crlf +
'Connection: close' + crlf +
'Host: ' + Host + crlf + crlf;
// А если таковые имеются, прибавляем их к заголовку
If Length(_cookie) <> 0 Then
begin
Head := 'GET ' + urlObj + ' HTTP/1.1' + crlf +
'User-Agent: Mozilla/4.8 [en](Windows NT 5.0; U)' + crlf +
'Connection: close' + crlf +
'Cookie: ' + _cookie + crlf +
'Host: ' + Host + crlf + crlf;
end;
// Отсылаем запрос
SendRequest(Host, 80, Head, Result);
// Если сервер сказал 302, переходим по сказанной локации
If Pos('302', Result) <> 0 then
begin
Redirect(Result, Host);
end;
end;
блин как запарился уже. Извините за офтоп и кучу всем давно надоевшим вопросам.