mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-06 05:18:16 +02:00
175 lines
3.5 KiB
ObjectPascal
175 lines
3.5 KiB
ObjectPascal
unit synapsewebclient;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fpwebclient, httpsend;
|
|
|
|
Type
|
|
|
|
{ TSynapseRequest }
|
|
|
|
TSynapseRequest = Class(TWebClientRequest)
|
|
Private
|
|
FHTTP : THTTPSend;
|
|
Protected
|
|
function GetHeaders: TStrings;override;
|
|
function GetStream: TStream;override;
|
|
Public
|
|
Constructor Create(AHTTP : THTTPSend);
|
|
Destructor Destroy; override;
|
|
end;
|
|
|
|
{ TSynapseResponse }
|
|
|
|
TSynapseResponse = Class(TWebClientResponse)
|
|
Private
|
|
FHTTP : THTTPSend;
|
|
Protected
|
|
function GetHeaders: TStrings;override;
|
|
function GetStream: TStream;override;
|
|
Function GetStatusCode : Integer; override;
|
|
Function GetStatusText : String; override;
|
|
Public
|
|
Constructor Create(ARequest : TWebClientRequest); override;
|
|
Destructor Destroy; override;
|
|
end;
|
|
|
|
{ TSynapseWebClient }
|
|
|
|
TSynapseWebClient = Class(TAbstractWebClient)
|
|
Protected
|
|
Function DoCreateRequest: TWebClientRequest; override;
|
|
Function DoHTTPMethod(Const AMethod,AURL : String; ARequest : TWebClientRequest) : TWebClientResponse; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TSynapseRequest }
|
|
|
|
function TSynapseRequest.GetHeaders: TStrings;
|
|
begin
|
|
if Assigned(FHTTP) then
|
|
Result:=FHTTP.Headers
|
|
else
|
|
Result:=Inherited GetHeaders;
|
|
end;
|
|
|
|
function TSynapseRequest.GetStream: TStream;
|
|
begin
|
|
if Assigned(FHTTP) then
|
|
Result:=FHTTP.Document
|
|
else
|
|
Result:=Inherited GetStream;
|
|
end;
|
|
|
|
Constructor TSynapseRequest.Create(AHTTP: THTTPSend);
|
|
begin
|
|
FHTTP:=AHTTP;
|
|
end;
|
|
|
|
Destructor TSynapseRequest.Destroy;
|
|
begin
|
|
FreeAndNil(FHTTP);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{ TSynapseResponse }
|
|
|
|
function TSynapseResponse.GetHeaders: TStrings;
|
|
begin
|
|
if Assigned(FHTTP) then
|
|
Result:=FHTTP.Headers
|
|
else
|
|
Result:=Inherited GetHeaders;
|
|
end;
|
|
|
|
function TSynapseResponse.GetStream: TStream;
|
|
begin
|
|
if Assigned(FHTTP) then
|
|
Result:=FHTTP.Document
|
|
else
|
|
Result:=Inherited GetStream;
|
|
end;
|
|
|
|
Function TSynapseResponse.GetStatusCode: Integer;
|
|
begin
|
|
if Assigned(FHTTP) then
|
|
Result:=FHTTP.ResultCode
|
|
else
|
|
Result:=0;
|
|
end;
|
|
|
|
Function TSynapseResponse.GetStatusText: String;
|
|
begin
|
|
if Assigned(FHTTP) then
|
|
Result:=FHTTP.ResultString
|
|
else
|
|
Result:='';
|
|
end;
|
|
|
|
Constructor TSynapseResponse.Create(ARequest : TWebClientRequest);
|
|
begin
|
|
Inherited Create(ARequest);
|
|
FHTTP:=(ARequest as TSynapseRequest).FHTTP;
|
|
end;
|
|
|
|
Destructor TSynapseResponse.Destroy;
|
|
begin
|
|
FreeAndNil(FHTTP);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{ TSynapseWebClient }
|
|
|
|
Function TSynapseWebClient.DoCreateRequest: TWebClientRequest;
|
|
begin
|
|
Result:=TSynapseRequest.Create(THTTPSend.Create);
|
|
end;
|
|
|
|
Function TSynapseWebClient.DoHTTPMethod(Const AMethod, AURL: String;
|
|
ARequest: TWebClientRequest): TWebClientResponse;
|
|
|
|
Var
|
|
U,S : String;
|
|
I : Integer;
|
|
h : THTTPSend;
|
|
|
|
begin
|
|
U:=AURL;
|
|
H:=TSynapseRequest(ARequest).FHTTP;
|
|
S:=ARequest.ParamsAsQuery;
|
|
if (S<>'') then
|
|
begin
|
|
if Pos('?',U)=0 then
|
|
U:=U+'?';
|
|
U:=U+S;
|
|
end;
|
|
I:=H.Headers.IndexOfName('Content-type');
|
|
if I<>-1 then
|
|
begin
|
|
H.MimeType:=H.Headers.Values['Content-type'];
|
|
H.Headers.Delete(I);
|
|
end;
|
|
if Not H.HTTPMethod(AMethod,U) then
|
|
begin
|
|
H.Document.Clear;
|
|
H.Headers.Clear;
|
|
H.Cookies.Clear;
|
|
With H.Sock do
|
|
Raise EFPWebClient.CreateFmt('HTTP Request failed (%d : %s)',[LastError,LastErrorDesc]);
|
|
end
|
|
else
|
|
begin
|
|
Result:=TSynapseResponse.Create(ARequest);
|
|
if Assigned(ARequest.ResponseContent) then
|
|
ARequest.ResponseContent.CopyFrom(ARequest.Content,0);
|
|
TSynapseRequest(ARequest).FHTTP:=Nil;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|