die console demo "/examples/console/lhttp" funktioniert mit https, es bekommt die Daten vollständig.
Aus dem Demo Code habe ich mir eine einfache Klasse geschrieben, jedoch mit dieser bekomme ich garkeinen Text von einer "https://..." Seite.
Ich rufe es so auf:
Code: Alles auswählen
var
https: THTTPSHandler;
Response : TStringStream;
Response := TStringStream.Create('');
https := THTTPSHandler.Create;
https.Request(url, data, Response);
Code: Alles auswählen
unit httpsclient;
{$mode objfpc}{$H+}
interface
uses
classes, sysutils, strutils, lnet, lhttp, lHTTPUtil, lnetSSL, URIParser, LCLProc;
type
{ THTTPSHandler }
THTTPSHandler = class
private
HttpClient: TLHTTPClient;
Done: boolean;
TargetStream: TStream;
public
procedure Request(Const URL, DATA : String; Dest : TStream);
procedure ClientDisconnect(ASocket: TLSocket);
procedure ClientDoneInput(ASocket: TLHTTPClientSocket);
procedure ClientError(const Msg: string; aSocket: TLSocket);
function ClientInput(ASocket: TLHTTPClientSocket; ABuffer: pchar;
ASize: Integer): Integer;
procedure ClientProcessHeaders(ASocket: TLHTTPClientSocket);
end;
implementation
{ THTTPSHandler }
procedure THTTPSHandler.Request(const URL, DATA: String; Dest: TStream);
var
Host, URI, FileName, AltFileName: string;
Port: Word;
index: Integer;
UseSSL: Boolean;
SSLSession: TLSSLSession;
begin
UseSSL := DecomposeURL(URL, Host, URI, Port);
DebugLn('Host: ', Host, ' URI: ', URI, ' Port: ', IntToStr(Port));
TargetStream := Dest;
HttpClient := TLHTTPClient.Create(nil);
SSLSession := TLSSLSession.Create(HttpClient);
SSLSession.SSLActive := UseSSL;
HttpClient.Session := SSLSession;
HttpClient.Host := Host;
HttpClient.Method := hmGet;
HttpClient.Port := Port;
HttpClient.URI := URI;
HttpClient.Timeout := -1;
HttpClient.OnDisconnect := @ClientDisconnect;
HttpClient.OnDoneInput := @ClientDoneInput;
HttpClient.OnError := @ClientError;
HttpClient.OnInput := @ClientInput;
HttpClient.OnProcessHeaders := @ClientProcessHeaders;
HttpClient.SendRequest;
Done := false;
while not Done do
HttpClient.CallAction;
HttpClient.Free;
end;
procedure THTTPSHandler.ClientError(const Msg: string; aSocket: TLSocket);
begin
raise Exception.Create('Error: '+ Msg);
end;
procedure THTTPSHandler.ClientDisconnect(ASocket: TLSocket);
begin
DebugLn('Disconnected.');
done := true;
end;
procedure THTTPSHandler.ClientDoneInput(ASocket: TLHTTPClientSocket);
begin
DebugLn('done.');
ASocket.Disconnect;
end;
function THTTPSHandler.ClientInput(ASocket: TLHTTPClientSocket;
ABuffer: pchar; ASize: Integer): Integer;
begin
Result:=TargetStream.Write(aBuffer[0], aSize);
end;
procedure THTTPSHandler.ClientProcessHeaders(ASocket: TLHTTPClientSocket);
begin
DebugLn('Response: ', INtToStr( HTTPStatusCodes[ASocket.ResponseStatus]), ' ',
ASocket.ResponseReason, ', data...');
end;
end.
Gute Nacht,
Eugen