Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal URL wininet ermitteln (https://www.delphipraxis.net/163278-url-wininet-ermitteln.html)

Pascal95 22. Sep 2011 18:13

URL wininet ermitteln
 
Hallo,

ich lade mir mit wininet-Funktionen etwas aus dem Internet herunter...

Ich verwende diese Funktion.

Nun könnte man denken, ich kann mir einfach die URL, die ich ja auch als Parameter angebe, nehmen.
Dem ist aber nicht so, da ich weitergeleitet werde - ich brauche dann die andere URL.

Also
Code:
DownloadFile('http://xyz.de/abc.html')
ich werde auf die Seite "http://xyz.de/seite2.html" weitergeleitet und bekomme mit DownloadFile auch korrekterweise den Inhalt der neuen Seite, was ich gut finde.

Allerdings "weiß" ich ja nicht, dass ich jetzt eigentlich auf "http://xyz.de/seite2.html" bin. Trotzdem erhalte ich dessen Inhalt.

Wie kriege ich sowas wie im Beispiel http://xyz.de/seite2.html" genannt heraus ?

Vielen Dank,
Pascal

JamesTKirk 23. Sep 2011 11:17

AW: URL wininet ermitteln
 
Die folgenden Einträge in der MSDN könnten dir weiterhelfen:

InternetOpenUrl: Du musst wahrschleinlich das Flag INTERNET_FLAG_NO_AUTO_REDIRECT setzen, damit du das Ziel des Redirects ermitteln kannst.
HttpQueryInfo: Hiermit kannst du die Headerdaten, welche der Server geschickt hat, betrachten.
Query Info Flags: Diese Flags musst du in der oben genannten HttpQueryInfo angeben. Besonders HTTP_QUERY_LOCATION und HTTP_QUERY_STATUS_CODE sind interessant.

Deine prinzipielle Vorgehensweise sollte diese sein:
  • Öffne die URL mittels InternetOpenUrl und dem genannten Flag
  • Hole dir den Statuscode der Requests (HttpQueryInfo mit HTTP_QUERY_STATUS_CODE); ist dieser z. B. 301 (beachte dabei die Liste der existierenden Codes), dann sollst du weitergeleitet werden.
  • Also nun die Ziellocation ermitteln (HttpQueryInfo mit HTTP_QUERY_LOCATION)
  • Neuen Aufruf von InternetOpenUrl mit dem neuen Ziel.

Das sollte funktionieren. Bedenke bitte, dass ich das nicht getestet, sondern nur an Hand der verlinkten Dokumentation hergeleitet habe.

Gruß,
Sven

Pascal95 23. Sep 2011 13:31

AW: URL wininet ermitteln
 
Hallo,

vielen Dank für deine Antwort!

Ich halte die Idee für sehr gut.

Momentan erhalte ich mit ausgeschalteter Redirection einen 302.

Laut Wiki ist das eine typische Weiterleitung, also komme ich der Sache näher...



Ich werde mich nochmal melden.

Pascal

Pascal95 23. Sep 2011 13:44

AW: URL wininet ermitteln
 
Ich habe es geschafft !

:-D

Ohne Deine Hilfe hätte ich das nicht geschafft !

Als Dank dafür veröffentliche ich den Code, um die Weiterleitungs-URL herauszufinden:
Delphi-Quellcode:
function GetRedirection(const Url: string): string;
var
  hInet: HINTERNET;
  hConnect: HINTERNET;
  infoBuffer: array [0..512] of char;
  dummy: DWORD;
  bufLen: DWORD;
  okay: longbool;
  reply: string;
begin
  Result := '?';

  hInet := InternetOpen(PChar('a browser...'), INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);

  hConnect := InternetOpenUrl(hInet, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD +
    INTERNET_FLAG_NO_AUTO_REDIRECT, 0);

  if not Assigned(hConnect) then
    Exit
  else
  begin
    dummy := 0;
    bufLen := Length(infoBuffer);
    okay  := HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE,
      @infoBuffer[0], bufLen, dummy);
    if not okay then
      Exit
    else
    begin
      reply := infoBuffer;
      if (reply = '301') or (reply = '302') then
      begin
        dummy := 0;
        bufLen := Length(infoBuffer);
        okay  := HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION,
          @infoBuffer[0], bufLen, dummy);
        if not okay then
          Exit
        else
        begin
          reply := infoBuffer;
          if reply <> '' then
            Result := reply;
        end;
      end
      else
        Exit;
    end;
    InternetCloseHandle(hConnect);
  end;
  InternetCloseHandle(hInet);
end;
Hoffentlich kann jemand das gebrauchen !

Nochmals vielen Dank,
liebe Grüße,
Pascal

JamesTKirk 23. Sep 2011 14:24

AW: URL wininet ermitteln
 
Zitat:

Zitat von Pascal95 (Beitrag 1126223)
Ohne Deine Hilfe hätte ich das nicht geschafft !

Gern geschehen.

Eine Frage habe ich jedoch:

Delphi-Quellcode:
var
  hConnect: HINTERNET;
begin
  ...
  if not Assigned(hConnect) then
    Exit
  else
    ...
end;
Ist
Delphi-Quellcode:
HINTERNET
als Zeiger definiert? Ansonsten ist
Delphi-Quellcode:
Assigned
falsch und du solltest stattdessen auf 0 überprüfen.

Gruß,
Sven

Pascal95 24. Sep 2011 13:42

AW: URL wininet ermitteln
 
Ja,

in der wininet.pp:
Delphi-Quellcode:
type
     HINTERNET = LPVOID;
und in der base.inc:
Delphi-Quellcode:
type
...
     LPVOID = pointer;
Hoffe, dass das passt ;)

Pascal

JamesTKirk 26. Sep 2011 09:51

AW: URL wininet ermitteln
 
Zitat:

Zitat von Pascal95 (Beitrag 1126420)
Hoffe, dass das passt ;)

Jupp, das passt. Ich hab nur reagiert, da die meiste Zeit die H...-Typen von Windows als Cardinal/QWord definiert sind...

Gruß,
Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz