Files
lazarus-ccr/wst/trunk/fpc_http_protocol.pas

214 lines
5.3 KiB
ObjectPascal
Raw Normal View History

{
This file is part of the Web Service Toolkit
Copyright (c) 2006 by Inoussa OUEDRAOGO
This file is provide under modified LGPL licence
( the files COPYING.modifiedLGPL and COPYING.LGPL).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
{$INCLUDE wst_global.inc}
unit fpc_http_protocol;
//{$DEFINE WST_DBG}
interface
uses
Classes, SysUtils,
wst_types, service_intf, imp_utils, base_service_intf, client_utils,
fphttpclient;
Const
sTRANSPORT_NAME = 'HTTP';
Type
{ TFPCCookieManager }
TFPCCookieManager = class(TInterfacedObject,ICookieManager)
private
FReferencedObject : TStrings;
protected
property ReferencedObject : TStrings read FReferencedObject;
protected
function GetCount() : Integer;
function GetName(const AIndex : Integer) : string;
function GetValue(const AIndex : Integer) : string; overload;
function GetValue(const AName : string) : string; overload;
procedure SetValue(const AIndex : Integer; const AValue : string); overload;
procedure SetValue(const AName : string; const AValue : string); overload;
public
constructor Create(AReferencedObject : TStrings);
end;
{$M+}
{ THTTPTransport }
THTTPTransport = class(TBaseTransport,ITransport)
Private
FConnection : TFPHTTPClient;
FAddress : string;
FFormat : string;
FCookieManager : ICookieManager;
private
function GetAddress: string;
function GetContentType: string;
function GetSoapAction : string;
procedure SetAddress(const AValue: string);
procedure SetContentType(const AValue: string);
procedure DoSendAndReceive(ARequest,AResponse:TStream); override;
procedure SetSoapAction(const AValue : string);
Public
constructor Create();override;
destructor Destroy();override;
function GetTransportName() : string; override;
function GetCookieManager() : ICookieManager; override;
Published
property ContentType : string Read GetContentType Write SetContentType;
property Address : string Read GetAddress Write SetAddress;
property SoapAction : string read GetSoapAction write SetSoapAction;
property Format : string read FFormat write FFormat;
End;
{$M+}
procedure FPC_RegisterHTTP_Transport();
implementation
uses
wst_consts;
const
s_soapAction_Header = 'soapAction';
{ THTTPTransport }
function THTTPTransport.GetAddress: string;
begin
Result := FAddress;
end;
function THTTPTransport.GetContentType: string;
begin
Result := FConnection.GetHeader('Content-type');
end;
function THTTPTransport.GetSoapAction : string;
begin
Result := FConnection.GetHeader(s_soapAction_Header);
end;
procedure THTTPTransport.SetAddress(const AValue: string);
begin
FAddress := AValue;
end;
procedure THTTPTransport.SetContentType(const AValue: string);
begin
FConnection.AddHeader('Content-type',AValue);
end;
constructor THTTPTransport.Create();
begin
inherited Create();
FConnection:=TFPHTTPClient.Create(Nil);
FConnection.HTTPVersion := '1.1';
end;
destructor THTTPTransport.Destroy();
begin
FreeAndNil(FConnection);
inherited Destroy();
end;
function THTTPTransport.GetTransportName() : string;
begin
Result := sTRANSPORT_NAME;
end;
procedure THTTPTransport.DoSendAndReceive(ARequest, AResponse: TStream);
var
EMsg : String;
i : Integer;
begin
try
ARequest.position:=0;
FConnection.RequestBody:=ARequest;
i := FConnection.IndexOfHeader('Content-length');
if (i >= 0) then
FConnection.RequestHeaders.Delete(i);
FConnection.Post(FAddress,AResponse);
except
On E : Exception do
EMsg:=E.Message;
end;
if (EMsg<>'') then
raise ETransportExecption.CreateFmt(SERR_FailedTransportRequest,[sTRANSPORT_NAME,FAddress]);
end;
procedure THTTPTransport.SetSoapAction(const AValue : string);
begin
FConnection.AddHeader(s_soapAction_Header,AValue);
end;
function THTTPTransport.GetCookieManager() : ICookieManager;
begin
if (FCookieManager=nil) then
FCookieManager:=TFPCCookieManager.Create(FConnection.Cookies);
Result:=FCookieManager;
end;
procedure FPC_RegisterHTTP_Transport();
begin
GetTransportRegistry().Register(sTRANSPORT_NAME,TSimpleItemFactory.Create(THTTPTransport));
end;
{ TFPCCookieManager }
function TFPCCookieManager.GetCount() : Integer;
begin
Result := ReferencedObject.Count;
end;
function TFPCCookieManager.GetName(const AIndex : Integer) : string;
begin
Result := ReferencedObject.Names[AIndex];
end;
function TFPCCookieManager.GetValue(const AIndex : Integer) : string;
begin
Result := ReferencedObject.ValueFromIndex[AIndex];
end;
function TFPCCookieManager.GetValue(const AName : string) : string;
begin
Result := ReferencedObject.Values[AName];
end;
procedure TFPCCookieManager.SetValue(
const AIndex : Integer;
const AValue : string
);
begin
ReferencedObject.ValueFromIndex[AIndex] := AValue;
end;
procedure TFPCCookieManager.SetValue(
const AName : string;
const AValue : string
);
begin
ReferencedObject.Values[AName] := AValue;
end;
constructor TFPCCookieManager.Create(AReferencedObject : TStrings);
begin
if (AReferencedObject = nil) then
raise ETransportExecption.CreateFmt(SERR_InvalidParameter,['AReferencedObject']);
FReferencedObject := AReferencedObject;
end;
end.