Synapse(SynHttp), przekierowanie

0

Witam!

Otóż mam problem z przekierowaniami z uzyciem synhttp(synapse). Korzystam z tego komponentu, ponieważ indy robi problemy z POST.
Tak więc problem wygląda tak:

  1. Otwieram stronę za pomocą
  SynHttp.HTTPMethod('GET', Base_Url);
     SynHttp.Document.SaveToStream(StreamOut);
     Form1.Memo1.Lines.Text:=StreamOut.DataString; 

i otrzymuje:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.odec.es/">here</a>.</p>
<hr>
<address>Apache/2.0.52 (Red Hat) Server at www.ip-adress.com Port 80</address>
</body></html>

przy uzyciu

  Form1.memo1.Lines.Append(SynHttp.ResultString);

dostaję wynik:
Moved Permanently

Czyli zostałem tak jakby przeniesiony. Jak to obslużyć, tzn jak otworzyć już tą 'nową' stronę?

Pozdrawiam,

0

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;

0 użytkowników online, w tym zalogowanych: 0, gości: 0