Poniżej masz przykład. Potrzeba po prostu sprawdzić kiedy kod błędu wynosi 301 lub 302 i go obslużyć - sprawdzając w
nagłowkach, na jaki adres następuje przekierowanie. Kod w oryginale stworzył Misiekd. Ja lekko tylko zmodyfikowałem
poniższy kod. Przy okazji widzisz też jak można zapisać do Streama dane do metody POST (zmienna FStrData jest typu
string), a także zapisać wynik pobrania od razu do zmiennej FPage też typu string. Chociaż u Ciebie - jeżeli chcesz mieć
w Memo to co zostało pobrane to wystarczy, że zrobisz Memo1.Lines.LoadFromStream(SynHttp.Document); i jak tutaj
widzisz, nie potrzeba dodatkowych zmiennych. Czyli podsumowując przekierowanie - to sprawdzenie pętlą nagłówków.
//...
const
Redir_C = 'Location: ';
Referer_C = 'Referer: ';
Base_Url = 'http://jakas-strona.pl/';
Default_MimeType = 'application/x-www-form-urlencoded';
Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.7.62 Version/11.01';
procedure TMainForm.HttpAction(WhatAction : THttpAction; Encode, InsertHeader : boolean);
var
I, RedirPos : integer;
Action, RedirUrl : string;
begin
case WhatAction of
acGet : Action := 'GET';
acPost : Action := 'POST';
end;
with SynHttp do
begin
Headers.Clear;
Document.Clear;
KeepAlive := True;
Protocol := '1.1';
if InsertHeader = True then
begin
Headers.Insert(0, Referer_C + FRefererUrl);
end;
MimeType := Default_MimeType;
UserAgent := Opera_UserAgent;
Document.Write(PChar(FStrData)^, Length(FStrData));
if HTTPMethod(Action, FUrl) = True then
begin
while (ResultCode = 301) or (ResultCode = 302) do
begin
for I := 0 to Headers.Count - 1 do
begin
RedirPos := Pos(Redir_C, Headers[I]);
if RedirPos > 0 then
begin
RedirUrl := Copy(Headers[I], RedirPos + Length(Redir_C), MaxInt);
if Pos('http://', RedirUrl) <> 1 then
begin
RedirUrl := Base_Url + RedirUrl;
end;
Headers.Clear;
if HTTPMethod(Action, RedirUrl) = False then
begin
Exit;
end;
Break;
end;
end;
end;
SetLength(FPage, Document.Size);
Document.Read(PChar(FPage)^, Document.Size);
if Encode = True then
begin
FPage := UTF8ToAnsi(FPage);
end;
end;
end;
end;