Componentes.Terceros.RemObj.../internal/5.0.23.613/1/RemObjects SDK for Delphi/Source/uROIpSuperHttpServer.pas
david 2824855ea7 - Modificación del paquete RemObjects_Core_D10 para que sea un paquete de runtime/designtime (antes era designtime sólo)
- Recompilación en Delphi10 de todos los paquetes de RO para generar las DCU's en Lib\D10
- Recompilación en Delphi10 de todos los paquetes de DA para generar las DCU's en Lib\D10

git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.RemObjects@9 b6239004-a887-0f4b-9937-50029ccdca16
2007-09-10 14:06:19 +00:00

189 lines
5.5 KiB
ObjectPascal

unit uROIpSuperHttpServer;
interface
{$I RemObjects.inc}
uses
SysUtils, Classes, uIPAsyncSocket, uIPAsyncHttpServer, uROServer,
uROBaseSuperHttpServer, uIPHttpHeaders;
const
DefaultServerName = 'RemObjects SDK Super IpHttp Server for Delphi';
type
TROIpSuperHttpServer = class(TROBaseSuperHttpServer)
private
fSocket: TIPAsyncHttpServer;
fOnManualBindSocket: TNotifyEvent;
fOnUnknownRequest: TIPAsyncHttpRequestHandler;
fServerName: string;
function GetBindV4: Boolean;
function GetBindV6: Boolean;
function GetPort: Integer;
procedure SetBindV4(const Value: Boolean);
procedure SetPort(const Value: Integer);
procedure SetBindV6(const Value: Boolean);
protected
procedure CloseConnection(aConnection: IUnknown); override;
function HandleUnknownRequest(aTarget: IUnknown; arequest: TIPHttpRequestHeaders; aData: TDynamicByteArray): Boolean; override;
procedure SendResponse(aTarget: IUnknown; aHeaders: TIPHttpResponseHeaders; aData: TDynamicByteArray; UserData: IInterface);override;
procedure SetDefaultHeaders(aTarget: IUnknown; aHeaders: TIPHttpResponseHeaders); override;
procedure DoActivate; override;
procedure DoDeactivate; override;
procedure IntRequest(Sender: TObject; aContext: IIPAsyncContext);
procedure IntBeforeCleanupContext(Sender: TObject; aContext: IIPAsyncContext);
procedure IntResponseSent(Sender: TObject; aContext: IIPAsyncContext);
procedure IntResponseFailed(Sender: TObject; aContext: IIPAsyncContext);
public
published
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
property Port: Integer read GetPort write SetPort default 80;
property BindV6: Boolean read GetBindV6 write SetBindV6 default false;
property BindV4: Boolean read GetBindV4 write SetBindV4 default true;
property ServerName: string read fServerName write FserverName;
property OnManualBindSocket: TNotifyEvent read fOnManualBindSocket write fOnManualBindSocket;
property OnUnknownRequest: TIPAsyncHttpRequestHandler read fOnUnknownRequest write fOnUnknownRequest;
end;
implementation
{ TROIpSuperHttpServer }
procedure TROIpSuperHttpServer.CloseConnection(aConnection: IUnknown);
begin
IIPAsyncContext(aConnection).GetSelf.Disconnect;
end;
constructor TROIpSuperHttpServer.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
fSocket := TIPAsyncHttpServer.Create;
fServerName := DefaultServerName;
fSocket.OnRequest := IntRequest;
fSocket.OnBeforeCleanupContext := IntBeforeCleanupContext;
fSocket.OnResponseSent := IntResponseSent;
fSocket.OnResponseFailed := IntResponseFailed;
end;
destructor TROIpSuperHttpServer.Destroy;
begin
FreeAndNil(fSocket);
inherited Destroy;
end;
procedure TROIpSuperHttpServer.DoActivate;
begin
inherited DoActivate;
fSocket.OnManualBind := fOnManualBindSocket;
fSocket.MaxPostData := MaxPackageSize + 1024;
fSocket.Active := true;
end;
procedure TROIpSuperHttpServer.DoDeactivate;
begin
if FSocket <> nil then fSocket.Active := false;
inherited DoDeactivate;
end;
function TROIpSuperHttpServer.GetBindV4: Boolean;
begin
result := fsocket.BindV4;
end;
function TROIpSuperHttpServer.GetBindV6: Boolean;
begin
result := fsocket.BindV6;
end;
function TROIpSuperHttpServer.GetPort: Integer;
begin
result := fSocket.Port;
end;
function TROIpSuperHttpServer.HandleUnknownRequest(aTarget: IUnknown;
arequest: TIPHttpRequestHeaders; aData: TDynamicByteArray): Boolean;
begin
if assigned(fOnUnknownRequest) then begin
fOnUnknownRequest(self, IIPAsyncContext(aTarget));
result := true;
end else
result := false;
end;
procedure TROIpSuperHttpServer.IntRequest(Sender: TObject;
aContext: IIPAsyncContext);
begin
HandleRequest(acontext, aContext.Request, aContext.RequestData);
end;
procedure TROIpSuperHttpServer.IntResponseFailed(Sender: TObject;
aContext: IIPAsyncContext);
begin
ResponseFailed(IUnknown(aContext.UserData));
end;
procedure TROIpSuperHttpServer.IntResponseSent(Sender: TObject;
aContext: IIPAsyncContext);
begin
ResponseSucessful(IUnknown(aContext.UserData));
end;
procedure TROIpSuperHttpServer.SendResponse(aTarget: IUnknown;
aHeaders: TIPHttpResponseHeaders; aData: TDynamicByteArray;
UserData: IInterface);
var
p: Pointer;
lTarget: IIPAsyncContext;
begin
lTarget := IIPAsyncContext(aTarget);
if aHeaders = nil then begin
SetDefaultHeaders(aTarget, lTarget.Response);
lTarget.Response.Headers.Values['Content-Type'] := 'application/octet-stream';
end else
lTarget.Response.Assign(aHeaders);
lTarget.ResponseData := aDAta;
p := nil;
IUnknown(P) := UserData;
lTarget.UserData := p;
lTarget.SendResponse;
end;
procedure TROIpSuperHttpServer.IntBeforeCleanupContext(Sender: TObject;
aContext: IIPAsyncContext);
var
p: Pointer;
begin
p := aContext.UserData;
aContext.UserData := nil;
IUnknown(P) := nil;
end;
procedure TROIpSuperHttpServer.SetBindV4(const Value: Boolean);
begin
fSocket.BindV4 := VAlue;
end;
procedure TROIpSuperHttpServer.SetDefaultHeaders(aTarget: IUnknown;
aHeaders: TIPHttpResponseHeaders);
begin
aHeaders.Headers.Values['Server'] := fServerName;
end;
procedure TROIpSuperHttpServer.SetPort(const Value: Integer);
begin
fSocket.Port := Value;
end;
procedure TROIpSuperHttpServer.SetBindV6(const Value: Boolean);
begin
fSocket.BindV6 := Value;
end;
end.