[Geloest] Synapse HTTPS GET mit Memory Leak?

Alle Fragen zur Netzwerkkommunikation
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

[Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von Eclipticon »

Hi,

ich lade mit folgendem Code eine Seite ueber HTTPS herunter und verwende dafuer Synapse und die OpenSSL Libraries Version 0.9.8d oder 1.0.2, beides auf Win32:

Code: Alles auswählen

function HttpsGetText(const URL: string; const Response: TStrings): boolean;
var
  HTTPSend: THTTPSend;
begin
  HTTPSend := THTTPSend.Create;
  try
    HTTPSend.Sock.CreateWithSSL(TSSLOpenSSL);
    HTTPSend.Sock.SSLDoConnect;
    Result := HTTPSend.HTTPMethod('GET', URL);
    if Result then
      Response.LoadFromStream(HTTPSend.Document);
  finally
    HTTPSend.Free;
  end;
end;
 
procedure TForm1.TestHttpsButtonClick(...);
var
  MyStrings: TStringList;
begin
  try
    MyStrings := TStringList.Create;
    if HttpsGetText('https://www.google.com/', MyStrings) then
      ShowMessage(MyStrings.CommaText);
  finally
    FreeAndNil(MyStrings)
  end;
end;


Das funktioniert auch, allerdings meldet heaptrc ein memory leak, sobald ich diesen Code ausfuehre:

scs.png
scs.png (6.98 KiB) 3491 mal betrachtet


Was mache ich hier falsch?

Danke und schoenen Abend!
Zuletzt geändert von Eclipticon am Sa 2. Mai 2015, 23:22, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Synapse HTTPS GET mit Memory Leak?

Beitrag von Michl »

Versuchs mal so:

Code: Alles auswählen

uses ...,httpsend, ssl_openssl;  //<- mit der Einbindung von ssl_openssl sollte der Job eigentlich gemacht werden
...
function HttpsGetText(const URL: string; const Response: TStrings): boolean;
var
  HTTPSend: THTTPSend;
begin
  HTTPSend := THTTPSend.Create;
  try
//    HTTPSend.Sock.CreateWithSSL(TSSLOpenSSL);
//    HTTPSend.Sock.SSLDoConnect;
    Result := HTTPSend.HTTPMethod('GET', URL);
    if Result then
      Response.LoadFromStream(HTTPSend.Document);
  finally
    HTTPSend.Free;
  end;
end;
 
procedure TForm1.TestHttpsButtonClick(...);
var
  MyStrings: TStringList;
begin
  try
    MyStrings := TStringList.Create;
    if HttpsGetText('https://www.google.com/', MyStrings) then
      ShowMessage(MyStrings.CommaText);
  finally
    FreeAndNil(MyStrings)
  end;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: Synapse HTTPS GET mit Memory Leak?

Beitrag von theo »

Du machst zu viel. Eine ssl_X Unit in die Uses aufnehmen reicht.

Code: Alles auswählen

uses ...  ssl_openssl,  httpsend;      
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   HttpGetText('https://www.google.com/',Memo1.lines);
end;   


EDIT: Michl war schneller. Ist ja auch schon spät... :wink:

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

[geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von Eclipticon »

Doppelt haelt besser, danke Euch beiden!

Und ich koennte schwoeren, dass es so urspruenglich nicht funktioniert hat, aber jetzt tut's ... :shock:

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

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von theo »

Pro Memoria: Habe es eben noch auf OpenSuse getestet:
Man muss openssl-devel (RPM) installiert haben, sonst geht es sang und klanglos nicht.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: [geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von mark332 »

Eclipticon hat geschrieben:Doppelt haelt besser, danke Euch beiden!

Und ich koennte schwoeren, dass es so urspruenglich nicht funktioniert hat, aber jetzt tut's ... :shock:


Du musst auf der entsprechenden Machine natürlich die Bibliotheken der SSL-Unit, die du verwendest installiert haben ;)
bei "uses ssl_openssl" natürlich OpenSSL

MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von corpsman »

Servus, habe hier diesen alten Thread gefunden, evtl könnt ihr mir helfen, versuche via Synapse eine Datei von einem https Server zu laden.

Code: Alles auswählen

 
 
Uses LazFileUtils, LazUTF8, ssl_openssl, HTTPSend;
 
Procedure DownLoadFile(URL, Filename: String);
Var
  f: TFileStream;
Begin
  With THTTPSend.Create Do Begin
    writeln(url);
    If HTTPMethod('GET', URL) Then Begin
      Try
        f := TFileStream.Create(Filename, fmOpenWrite Or fmCreate);
        f.CopyFrom(Document, Document.Size);
        f.Free;
      Except
      End;
    End;
    Free;
  End;
End;   
 


corpsman@corpsman2:~$ sudo aptitude install openssl
[sudo] password for corpsman:
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

corpsman@corpsman2:~$



Aufruf via :

Code: Alles auswählen

 
    DownLoadFile('https://d1u1p2xjjiahg3.cloudfront.net/e1d31c7c-5b8b-4294-923a-decc10206e72_l.jpg', '/tmp/test.jpg');
 


So wie es aussieht, klappt es nicht weil er in httpsend.pas "Fsock.lastError" <> 0 ist

Code: Alles auswählen

function THTTPSend.InternalDoConnect(needssl: Boolean): Boolean;
begin
  Result := False;
  FSock.CloseSocket;
  FSock.Bind(FIPInterface, cAnyPort);
  if FSock.LastError <> 0 then
    Exit;
  FSock.Connect(FTargetHost, FTargetPort);
  if FSock.LastError <> 0 then
    Exit;
  if needssl then
  begin
    if (FSock.SSL.SNIHost='') then
      FSock.SSL.SNIHost:=FTargetHost;
    FSock.SSLDoConnect;
    FSock.SSL.SNIHost:=''; //don't need it anymore and don't wan't to reuse it in next connection
    if FSock.LastError <> 0 then
      Exit;
  end;
  FAliveHost := FTargetHost;
  FAlivePort := FTargetPort;
  Result := True;
end


Jemand noch ne Idee, was ich anders machen kann ?, Tippe ich die File URL im Browser ein ist das Bild natürlich zu sehen..
--
Just try it

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von mark332 »

Hey corpsman,

eine direkte Antwort auf dein Problem habe ich nicht, aber ich wollte einmal anregen, dass du statt dem FileStream auch einfach "HTTP.Document.SaveToFile" verwenden kannst

MfG

mark332
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

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

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von theo »

Sind die OpenSSL Libs installiert/im Pfad?
Hast du die richtigen? http://synapse.ararat.cz/files/crypt/

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von corpsman »

Das Linux Packet OpenSSL ist installiert, falls du das meinst.

Wenn ich die Cryptlib.pas die du verlinkt hast mit in mein Projekt einbinde, dann kompiliert es nicht mehr..
--
Just try it

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

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von theo »

Nee, der Link war für Windows.

Hast du wie oben erwähnt auch openssl-devel installiert?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von corpsman »

hmm das scheint es auf meinem system nicht zu geben

corpsman@corpsman2:~$ uname -a
Linux corpsman2 3.13.0-45-generic #74-Ubuntu SMP Tue Jan 13 19:37:48 UTC 2015 i686 i686 i686 GNU/Linux


corpsman@corpsman2:~$ sudo aptitude install openss
openssh-blacklist openssh-sftp-server openssn
openssh-blacklist-extra openssl openssn-data
openssh-client openssl-blacklist openssn-dbg
openssh-server openssl-blacklist-extra
--
Just try it

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

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von theo »

Habe es eben getestet, bei mir geht der Code (OpenSuse) Das Jpeg kommt rein.

"devel" macht meistens Symlinks

Hast du /usr/lib64/libssl.so? Oder halt in /usr/lib ?
Evtl. auch /usr/lib64/libcrypto.so

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: [Geloest] Synapse HTTPS GET mit Memory Leak?

Beitrag von corpsman »

lol,
habe es gerade auf meinem Odroid U3 probiert, dort lädt er die Files wunderbar, nur kann ich sie aufgrund des GTK2 Bugs nicht anzeigen ;)

Damit sit klar das mein Source stimmt, nu muss ich nur noch rauskriegen welche lib auf meinem anderen System fehlt.

Danke für die Hinweise..

[Edit]
So habe das paket gefunden :

sudo aptitude install libssl-dev


Falls jemand anderes den Thread findet ;)
--
Just try it

Antworten