httpS-Request

Alle Fragen zur Netzwerkkommunikation
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

httpS-Request

Beitrag von MitjaStachowiak »

Hallo,

Ich habe in der Vergangenheit schon öfter mal versucht, HTTP-Request mit HTTPS zu machen, aber geschafft habe ich es nicht. Aber vielleicht hat sich ja inzwischen etwas getan. Für einige anstehende Projekte wäre das echt gut.

Einfach die Klasse httpsend einbinden und https://... als Adresse übergeben, funktioniert ja bekanntlich nicht. Man muss irgendwie openssl benutzen, aber mehr habe ich noch nicht 'rausgefunden.

Hat jemand ein Beispiel-Code, der ein Paar HTTPS-Requests (Get und Post) durchführen kann?

Vielen Dank.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: httpS-Request

Beitrag von m.fuchs »

Du meinst Synapse nehme ich mal an.

Das geht wirklich recht einfach. Du bindest die Unit Ssl_OpenSsl mit ein (und natürlich HttpSend) und änderst die URL von http:// auf https://.

Und dann musst du sicherstellen, dass die OpenSSL-Bibliotheken auf dem System verfügbar sind. Zum Beispiel indem du (unter Windows) die libeay32.dll und die ssleay32.dll in das gleiche Verzeichnis wie deine EXE packst. Wichtige ist, dass die Version von OpenSSL stimmt (im aktuellen Release von Synapse müsste es 0.9.7 sein). Infos dazu stehen im Header der Ssl_OpenSsl-Unit.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Hmm, das habe ich versucht, aber es ändert nichts. Sobald ich https:// schreibe, gibt HttpGetText false zurück...

Mun muss doch noch irgendwas mit ssl_openssl machen - oder soll httpsend automatisch erkennen, dass man das eingebunden hat?

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

Re: httpS-Request

Beitrag von theo »

Wie heisst denn die URL? Ich habe hier keine Probleme z.B. mit
https://alice.sni.velox.ch/
https://www.ssllabs.com/ssltest/

Mit ssl_openssl musst du nichts machen.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Aktuell geht es um hems-renewables.de - dort muss man das Zertifikat im Browser extra annehmen, aber ich habe eben https://www.ssllabs.com/ssltest/ getestet und es ging auch nicht.

Was ich auch merkwürdig finde ist, dass gar kein Fehler kommt, wenn ich die DLLs nicht im Programmordner habe. Darauf wird anscheinend gar nicht zugegriffen - jedenfalls sind die bei mir auch nicht in system32 oder so. Vielleicht habe ich die falschen DLLs und die können nicht geladen werden. Aber wie gesagt: Es kommt kein Fehler. Nur HTTPGetText gibt false zurück.

Vielleicht verwendet ihr etwas mit POST?

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

Re: httpS-Request

Beitrag von theo »

Wahrsch. hast du Windows 64bit Lazarus. Das geht afaik nicht mit den 32bit DLLs von hier http://synapse.ararat.cz/files/crypt/
Auf Linux geht's auch mit 64bit.
Versuche es mit der 32bit Version und den DLLs aus dem Link oder suche passende 64bit Varianten.

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: httpS-Request

Beitrag von BeniBela »

Alternative: Meine Internet Tools.

Die machen das ganze Https automatisch

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Ahaa, es lag wirklich an falschen DLLs. Ich habe jetzt das Zip "Openssl-0.9.8d-Win32.zip" runtergeladen. Als ich die DLLs davon im Programmordner abgelegt habe, zeigte sich eine erste Reaktion: Es kam die Meldung "Programm kann nicht gestartet werden, da msvcr71.dll fehlt". Gestartet ist es dann trotzdem, aber es ging noch nicht... Ich also auf C nach dieser DLL gesucht und auch noch in den Programmordner kopiert und es lief :-)

Meine msvcr71.dll war bei Sweet Home 3D dabei, kompiliert habe ich mit Lazarus für Win32.

Also vielen Dank euch allen.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Hmm, es gibt noch ein Problem: Das Programm hängt sich bei mir etwa alle 25.000 Requests auf. Die Funktion HTTPGetText bleibt dann hängen, auf unbestimmte Zeit. Ich kann das Programm dann nur noch per Taskmanager beenden. Für mein automatisches System, dass dauerhaft läuft und alle 10 Sekunden ein Request absetzt, ist das ziemlich hinderlich.

Da der Fehler so selten auftritt, konnte ich bislang nicht mehr dazu rausfinden.

Gibt es eine Möglicheit, den Thread, der die Uploads macht, programmintern neuzustarten? Hatte von euch schon jemand dieses Problem?

Ich teste gerade, ob das Problem mit anderen DLLs auch auftritt... Auf dem Zielsystem waren andere Versionen der benötigten DLLs schon vorhanden. Jetzt versuche ich die, die hier auch verlinkt sind. Wenn ich bis in 4 Wochen nicht geantwortet habe, ist das Problem zu 99,99%iger Wahrscheinlichkeit damit gelöst :mrgreen:

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: httpS-Request

Beitrag von mschnell »

Ich hatte mit Synapse (ohne httpget ohne ssl) mal das Problem, dass mir nicht klar war, dass man vor dem Request den Buffer löschen muss, weil ansonsten der - dadurch immer größer werdende - empfangene Inhalt wieder mit dem Request zum Server geschickt wird, wodurch dieser dann irgendwann blockierte. Synapse geht davon aus, dass das Objekt immer neu Instanziiert wird, wenn man es mehrfach verwendet muss man den Buffer löschen, was in der Doku nicht klar erwähnt wird.

Unabhängig davon muss ein "embedded" (automatisches) System immer so programmiert werden, dass ein Aufhängen (das ein Watchdog erkennen muss) durch eine möglichst brutale Maßnahme (Neustart) korrigiert wird.

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Nunja, das System wird ja jeden Tag neugestartet. Den Befehl dafür gibt aber auch mein Programm - ich weiß, ich sollte dafür einen separaten Prozess laufen lassen. Aber bisher lief es ja ohne Probleme.

Wie lösche ich denn den Buffer? (Die anderen DLLs haben das Problem nicht gelöst :| )

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

Re: httpS-Request

Beitrag von theo »

Clear könnte helfen.
Noch sicherer: THTTPSend vor jedem Gebrauch neu createn und danach freen.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Ok, danke.

Und falls es sich trotzdem aufhängt - gibt es eine elegantere Methode, den hängenden Thread zu beenden, als Taskkill?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: httpS-Request

Beitrag von Christian »

.Free
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: httpS-Request

Beitrag von MitjaStachowiak »

Hallo,

ich hatte bis gestern Klausuren und konnte mich erst jetzt an eine Lösung machen... Also dass ich die THTTP-Send-Klasse nicht freigebe, ist nicht die Ursache. Ich habe ja bislang direkt die Funktion HTTPGetText verwendet, welche folgender Maßen implementiert ist:

Code: Alles auswählen

function HttpGetText(const URL: string; const Response: TStrings): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
      Response.LoadFromStream(HTTP.Document);
  finally
    HTTP.Free;
  end;
end;


Ich werde das mal zu einem HTTPPostText umfunktionieren, aber das Bug muss irgendwo anders liegen...

Antworten