Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Rund um die LCL und andere Komponenten
Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von theo »

Stevie hat geschrieben: Fr 12. Apr 2024, 10:29 Worin genau schlägt THTTPSend denn eigentlich jetzt noch fehl? Noch immer Timeouts? Eigentlich müsste Synapse das nämlich ganz genauso hinbekommen wie FPHTTPClient...
Ich hab's auch noch kurz probiert. Der blockt ganz am Anfang.
Ich glaube nicht mehr, dass es am Header liegt. Habe damit verglichen:
http://echo-http-requests.appspot.com/echo

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von Stevie »

... hat mir ja keine Ruhe gelassen. So sollte es gehen:

Code: Alles auswählen

program PdfFetcher_Synapse;

{$mode objfpc}{$H+}

uses
 httpsend, ssl_openssl, classes, sysutils;

const
  cHost = 'www.st.com';
  cBaseURI = 'https://'+cHost+'/resource/en/datasheet/';
  cUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; v: 124.0) Gecko/20100101 Firefox/124.0';

var
  Docname      : String;
  Success      : Boolean;

function GetPDF(const aName : String) : Boolean;
var
  HTTPClient   : THTTPSend;
begin
 Result := False;

 HTTPClient := THTTPSend.Create;
 try
   HTTPClient.Headers.Add('Accept: */*');
   HTTPClient.UserAgent := cUserAgent;
   HTTPClient.Protocol := '1.1';

   Success := HTTPClient.HTTPMethod('GET', cBaseURI+aName);

   if Success Then
   begin
     HTTPClient.Document.Position := 0;
     HTTPClient.Document.SaveToFile(aName);
   end
   else
   begin
     writeln('Get failed.');
     writeln('Resultcode = ', HTTPClient.Resultcode);
     writeln('Resultstring = ', HTTPClient.Resultstring);
   end;
 finally
   HTTPClient.Free;
 end;
end;

begin
  if ParamCount <> 1 then
  begin
    writeln('Usage: PdfFetcher <Dokument>');
    Exit;
  end;

  DocName := ParamStr(1);
  if GetPdf(Docname) then
    writeln('Success!')
  else
    writeln('Failed!');
end.
Und auch hier gilt wieder, dass ich das mit schneller Feder hingepinselt habe, ist also funktional und nicht schick. :)

Wenn er bei ST blockt, dann weil der Client nicht in deren Freund-/Feind-Schema passt. Entweder, weil er den falschen User-Agent hat, er per HTTP (und nicht HTTPS) kommt, die falsche HTTP-Version verwendet o.ä.. Die sind da scheinbar ziemlich eigen.

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von theo »

Stimmt, es ist nur das Protocol.

Code: Alles auswählen

HTTP.Protocol:='1.1';   
Ich bin nicht drauf gekommen, weil die Abfrage mit echo-http-requests auch so "http_version": "HTTP/1.1" meldet.

Code: Alles auswählen

{
    "request": {
        "body": "", 
        "created": "2024-04-12 09:25:21.298382", 
        "headers": {
            "Accept": "*/*", 
            "Content-Type": "; charset=\"utf-8\"", 
            "Host": "echo-http-requests.appspot.com", 
            "Traceparent": "00-c0f21491c6c1879bd9b8b0f0d9008868-1887f93fdc3f1585-00", 
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; v: 124.0) Gecko/20100101 Firefox/124.0", 
            "X-Cloud-Trace-Context": "c0f21491c6c1879bd9b8b0f0d9008868/1767655431439586693"
        }, 
        "http_version": "HTTP/1.1", 
        "method": "GET", 
        "query_string": "", 
        "remote_address": "87.239.207.234", 
        "url": "http://echo-http-requests.appspot.com/echo"
    }, 
    "status": "OK"
}
Den Zirkus mit cHost kannst du dir übrigens schenken, das braucht's nicht.

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von Stevie »

Den Zirkus mit cHost kannst du dir übrigens schenken, das braucht's nicht.
Ja, stimmt, war mir auch aufgefallen. Hatte nur vergessen, es aus meinem Beispiel zu nehmen. Und ST hat kein Problem mit doppelten Headern, nur mit nicht vorhandenen oder falschen Headern. :)

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von theo »

Hier mal meine pfannenfertige Lösung, basierend auf dem oben verlinkten Redirect Code.
Schnell gehackt und kurz getestet. :wink:

Code: Alles auswählen

uses httpsend, ssl_openssl, ..

const
  cUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; v: 124.0) Gecko/20100101 Firefox/124.0';       
  
procedure HTTPGet(URL: string; UserAgent: string; out Document: TMemoryStream);
var
  HTTP: THTTPSend;
  i: integer;
  realurl: string;
begin
  // Setup
  HTTP := THTTPSend.Create;
  HTTP.Headers.Add('Accept: */*');
  HTTP.Protocol := '1.1';
  HTTP.UserAgent := UserAgent;
  realurl := '';
  // Perform HTTP request
  if HTTP.HTTPMethod('GET', URL) then
  begin
    // If its a 301 or 302 we need to do more processing
    if (HTTP.ResultCode = 301) or (HTTP.ResultCode = 302) then
    begin
      // Check the headers for the Location header
      for i := 0 to HTTP.Headers.Count - 1 do
      begin
        // Extract the URL
        if Copy(HTTP.Headers[i], 1, 8) = 'Location' then
          realurl := Copy(HTTP.Headers[i], 11, Length(HTTP.Headers[i]) - 11);
      end;
      //writeln('Redirecting to ', realurl);
      // If we have a URL, run it through the same function
      if Length(realurl) > 1 then HTTPGet(realurl, UserAgent, Document);
    end
    else
    begin
      http.Document.SaveToStream(Document);
    end;
  end;
  // Clean up
  HTTP.Free;
end;   

procedure TForm1.Button2Click(Sender: TObject);
var AStrm:TMemoryStream;
begin
 AStrm:=TMemoryStream.Create;
 HTTPGet('https://www.st.com/resource/en/datasheet/2n3055.pdf',cUserAgent, AStrm);
 Astrm.SaveToFile('/home/theo/test12.pdf');
 AStrm.free;
end;

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

Ich bin jetzt echt von den Sochen (und noch etwas müde, hab gestern bis 2 gemacht)

HTTPClient.Protocol := '1.1'; // Funktioniert! :D

Am Protocol hatte ich schon '2' eingestellt, weil der Firefox ebenfalls eine 2 sendet.
Per Default macht der HTTPClient eine '1.0' rein.
Dass man da auch eine '1.1' rein schreiben kann, auf die Idee bin ich nicht gekommen.

Vielen Dank für eure Hilfe :D

VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

@Theo, die Pfanne müsste man noch etwas länger braten ....

Code: Alles auswählen

URI := ParseURI(s);

: : :
      // Neue URL prüfen -> eventuell muss der Host hinzugefügt werden
      if Length(sUrl2) > 1 then
      Begin
        If Not SameText(Copy(sUrl2, 1, 8), 'https://') And
           Not SameText(Copy(sUrl2, 1, 7), 'http://') And
           Not SameText(Copy(sUrl2, 1, 4), 'self') Then
        Begin
          If Copy(sUrl2, 1, 1) = '/' Then
            sUrl2 := URI.Protocol + '://' + URI.Host + sUrl2
          else
            sUrl2 := URI.Protocol + '://' + URI.Host + '/' + sUrl2;
        End;
        If SameText(Copy(sUrl2, 1, 4), 'self') Then
          sUrl2 := '';
      End;
In der Textbasierten Welt von Internet bastelt so ziemlich jeder seine eigene Fettnäpfchen rein.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von theo »

MmVisual hat geschrieben: Fr 12. Apr 2024, 11:57 @Theo, die Pfanne müsste man noch etwas länger braten ....
Da sehe ich jetzt den Zusammenhang nicht.
Der Code oben ist für den Download zuständig, nicht für die Konstruktion des URI.
Oder wozu dient das?

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von MmVisual »

Der Redirect Link, den man aus dem Dokument heraus holt kann unter Umständen ohne "http" daher kommen und ohne den host, das müsste man dann zusammen setzen bevor man dem Redirect folgt.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von Stevie »

... aber ein Redirect wird laut HTTP Protokoll immer als ein Result Code 30x und einen "Location:" Header angefragt. Kannst Du ein konkreteres Beispiel zu dem Redirect im Document geben?

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von MmVisual »

Nein, kann ich nicht.
Ich habe nur den Code von hier:

viewtopic.php?p=140794#p140794

analysiert und verstanden was ich bei mir ändern muss. Also der Code kam ja mal rein weil irgend eine Webpage sich nicht an die Regeln hält.
Dennoch so zu 100% Wasserdicht wird man das ganze nicht bekommen, irgend wer hat da sicher wieder einen Sondermurks drin. Ich versuche so viel wie möglich ab zu decken.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von theo »

Ja gut, irgendwelche grenzwertigen Inkompatibilitäten kann man immer ausbügeln. Kann ja nicht schaden.

Was ich mich eher frage: Gibt es (noch) Webserver, die sich an HTTP.Protocol := '1.1' stören könnten und 1.0 verlangen?

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von Stevie »

Was ich mich eher frage: Gibt es (noch) Webserver, die sich an HTTP.Protocol := '1.1' stören könnten und 1.0 verlangen?
Na ja, wenn man denen hier (https://w3techs.com/technologies/histor ... lement/all) glaubt, dann sind es ziemlich stabile 25% an Web Servern, die mit HTTP/1.x unterwegs sind. Aber _ausschließlich_ HTTP/1.0 macht wohl kein ernstzunehmender Webserver mehr.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von MmVisual »

Es gibt so viele Webserver auf der Welt, da kann man wohl sicher die Frage mit "JA" beantworten.

Eher beunruhigt mich ob der Server nun V1.1 Antworten liefert die nun der HTTPClient nicht beherrscht.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von Stevie »

Übrigens habe ich mir das 'self' in dem Code-Snippet von PawelD mal angeschaut. Was das (erwartungsgemäß) macht, ist lediglich die Analyse des Location-Headers und den Zusammenbau des URI auf dessen Basis. Den Self-Part kannst Du wohl getrost vergessen, denn laut RFCs ist er nicht spezifiziert und ich habe ihn auch noch nie gesehen.

Antworten