* Restructured for clarity

git-svn-id: trunk@17088 -
This commit is contained in:
michael 2011-03-07 21:40:29 +00:00
parent a41260fdf6
commit 92dfe16e9a

View File

@ -21,7 +21,7 @@ unit custfcgi;
Interface
uses
Classes,SysUtils, httpdefs,custweb, custcgi, fastcgi;
Classes,SysUtils, httpdefs, Sockets, custweb, custcgi, fastcgi;
Type
{ TFCGIRequest }
@ -73,6 +73,8 @@ Type
Response : TFCgiResponse;
end;
{ TFCgiHandler }
TFCgiHandler = class(TWebHandler)
Private
FOnUnknownRecord: TUnknownRecordEvent;
@ -85,6 +87,8 @@ Type
FPort: integer;
function Read_FCGIRecord : PFCGI_Header;
protected
function ProcessRecord(AFCGI_Record: PFCGI_Header; out ARequest: TRequest; out AResponse: TResponse): boolean; virtual;
procedure SetupSocket(var IAddress: TInetSockAddr; var AddressLength: tsocklen); virtual;
function WaitForRequest(out ARequest : TRequest; out AResponse : TResponse) : boolean; override;
procedure EndRequest(ARequest : TRequest;AResponse : TResponse); override;
Public
@ -127,11 +131,11 @@ ResourceString
Implementation
uses
{$ifdef CGIDEBUG}
dbugintf,
uses
dbugintf;
{$endif}
Sockets;
{$undef nosignal}
@ -537,22 +541,10 @@ begin
end;
end;
function TFCgiHandler.WaitForRequest(out ARequest: TRequest; out AResponse: TResponse): boolean;
var
IAddress : TInetSockAddr;
AddressLength : tsocklen;
ARequestID : word;
AFCGI_Record : PFCGI_Header;
ATempRequest : TFCGIRequest;
procedure TFCgiHandler.SetupSocket(var IAddress : TInetSockAddr; Var AddressLength : tsocklen);
begin
Result := False;
AddressLength:=Sizeof(IAddress);
if Socket=0 then
begin
if Port<>0 then
begin
Socket := fpsocket(AF_INET,SOCK_STREAM,0);
if Socket=-1 then
raise EFPWebError.CreateFmt(SNoSocket,[socketerror]);
@ -576,25 +568,15 @@ begin
Terminate;
raise Exception.CreateFmt(SListenFailed,[port,socketerror]);
end;
end
else
Socket:=StdInputHandle;
end;
if FHandle=THandle(-1) then
begin
FHandle:=fpaccept(Socket,psockaddr(@IAddress),@AddressLength);
if FHandle=THandle(-1) then
begin
Terminate;
raise Exception.CreateFmt(SNoInputHandle,[socketerror]);
end;
end;
function TFCgiHandler.ProcessRecord(AFCGI_Record : PFCGI_Header; out ARequest: TRequest; out AResponse: TResponse): boolean;
repeat
AFCGI_Record:=Read_FCGIRecord;
if assigned(AFCGI_Record) then
try
var
ARequestID : word;
ATempRequest : TFCGIRequest;
begin
Result:=False;
ARequestID:=BEtoN(AFCGI_Record^.requestID);
if AFCGI_Record^.reqtype = FCGI_BEGIN_REQUEST then
begin
@ -605,7 +587,6 @@ begin
end;
assert(not assigned(FRequestsArray[ARequestID].Request));
assert(not assigned(FRequestsArray[ARequestID].Response));
ATempRequest:=TFCGIRequest.Create;
ATempRequest.RequestID:=ARequestID;
ATempRequest.Handle:=FHandle;
@ -620,13 +601,42 @@ begin
FRequestsArray[ARequestID].Response.ProtocolOptions:=Self.ProtocolOptions;
AResponse:=FRequestsArray[ARequestID].Response;
Result := True;
Break;
end;
end;
function TFCgiHandler.WaitForRequest(out ARequest: TRequest; out AResponse: TResponse): boolean;
var
IAddress : TInetSockAddr;
AddressLength : tsocklen;
AFCGI_Record : PFCGI_Header;
begin
Result := False;
if Socket=0 then
if Port<>0 then
SetupSocket(IAddress,AddressLength)
else
Socket:=StdInputHandle;
if FHandle=THandle(-1) then
begin
FHandle:=fpaccept(Socket,psockaddr(@IAddress),@AddressLength);
if FHandle=THandle(-1) then
begin
Terminate;
raise Exception.CreateFmt(SNoInputHandle,[socketerror]);
end;
end;
repeat
AFCGI_Record:=Read_FCGIRecord;
if assigned(AFCGI_Record) then
try
Result:=ProcessRecord(AFCGI_Record,ARequest,AResponse);
Finally
FreeMem(AFCGI_Record);
AFCGI_Record:=Nil;
end;
until (1<>1);
until Result;
end;
{ TCustomFCgiApplication }