瀏覽代碼

* Use global class vars to create handler/request/response. Avoids having to do 2 overrides

git-svn-id: trunk@26560 -
michael 11 年之前
父節點
當前提交
bef2957e0b
共有 2 個文件被更改,包括 82 次插入15 次删除
  1. 51 12
      packages/fcl-web/src/base/custcgi.pp
  2. 31 3
      packages/fcl-web/src/base/custfcgi.pp

+ 51 - 12
packages/fcl-web/src/base/custcgi.pp

@@ -33,7 +33,7 @@ Type
     function GetCGIVar(Index: integer): String;
   Protected
     Function GetFieldValue(Index : Integer) : String; override;
-    Procedure InitFromEnvironment;
+    Procedure InitFromEnvironment; virtual;
     procedure ReadContent; override;
   Public
     Constructor CreateCGI(ACGI : TCGIHandler);
@@ -45,7 +45,7 @@ Type
     Property ServerProtocol : String Index 6 read GetCGIVar;
     Property ServerSoftware : String Index 7 read GetCGIVar;
   end;
-  
+  TCGIRequestClass = Class of TCGIRequest;
   { TCGIResponse }
 
   TCGIResponse = Class(TResponse)
@@ -58,9 +58,12 @@ Type
   Public
     Constructor CreateCGI(ACGI : TCGIHandler; AStream : TStream);
   end;
+  TCGIResponseClass = Class of TCGIResponse;
 
   { TCustomCgiApplication }
 
+  { TCgiHandler }
+
   TCgiHandler = Class(TWebHandler)
   Private
     FResponse : TCGIResponse;
@@ -71,6 +74,7 @@ Type
     Function GetAdministrator : String; override;
     Function CreateResponse(AOutput : TStream) : TCGIResponse; virtual;
     Function CreateRequest : TCGIRequest; virtual;
+    Procedure InitRequest(ARequest : TRequest); override;
     function WaitForRequest(out ARequest : TRequest; out AResponse : TResponse) : boolean; override;
     procedure EndRequest(ARequest : TRequest;AResponse : TResponse); override;
   Public
@@ -78,6 +82,7 @@ Type
     Property Request : TCGIRequest read FRequest;
     Property Response: TCGIResponse Read FResponse;
   end;
+  TCgiHandlerClass = Class of TCgiHandler;
 
   { TCustomCgiApplication }
 
@@ -104,6 +109,10 @@ Type
     Property RequestVariableCount : Integer Read GetRequestVariableCount;
   end;
 
+Var
+  CGIRequestClass : TCGIRequestClass = TCGIRequest;
+  CGIResponseClass : TCGIResponseClass = TCGIResponse;
+  CGIWebHandlerClass : TCgiHandlerClass = TCgiHandler;
 
 ResourceString
   SWebMaster = 'webmaster';
@@ -159,7 +168,7 @@ Const
     { 37: 'XHTTPREQUESTEDWITH'     } FieldAuthorization
   );
 
-Procedure TCgiHandler.GetCGIVarList(List : TStrings);
+procedure TCgiHandler.GetCGIVarList(List: TStrings);
 
 Var
   I : Integer;
@@ -170,7 +179,7 @@ begin
     List.Add(CGIVarNames[i]+'='+GetEnvironmentVariable(CGIVarNames[i]));
 end;
 
-Function TCgiHandler.GetEmail : String;
+function TCgiHandler.GetEmail: String;
 
 Var
   H : String;
@@ -185,7 +194,7 @@ begin
     end;
 end;
 
-Function TCgiHandler.GetAdministrator : String;
+function TCgiHandler.GetAdministrator: String;
 
 begin
   Result:=Inherited GetAdministrator;
@@ -194,23 +203,46 @@ begin
 end;
 
 function TCgiHandler.CreateResponse(AOutput : TStream): TCGIResponse;
+
+Var
+  C : TCGIResponseClass;
+
 begin
-  result := TCGIResponse.CreateCGI(Self,AOutput);
+  C:=CGIResponseClass;
+  if (C=Nil) then
+    C:=TCGIResponse;
+  Result:=TCGIResponse.CreateCGI(Self,AOutput);
 end;
 
 function TCgiHandler.CreateRequest: TCGIRequest;
+
+Var
+  C : TCGIRequestClass;
+
 begin
-  Result:=TCGIRequest.CreateCGI(Self);
+  C:=CGIRequestClass;
+  if (C=Nil) then
+    C:=TCGIRequest;
+  Result:=C.CreateCGI(Self);
+end;
+
+procedure TCgiHandler.InitRequest(ARequest: TRequest);
+begin
+  inherited InitRequest(ARequest);
+  if (ARequest is TCGIRequest) then
+    With (ARequest as TCGIRequest) do
+      begin
+      InitFromEnvironment;
+      InitRequestVars;
+      end;
 end;
 
 function TCgiHandler.WaitForRequest(out ARequest: TRequest; out AResponse: TResponse): boolean;
 begin
-  FRequest:=CreateRequest;
-  InitRequest(FRequest);
-  FRequest.InitFromEnvironment;
-  FRequest.InitRequestVars;
   FOutput:=TIOStream.Create(iosOutput);
+  FRequest:=CreateRequest;
   FResponse:=CreateResponse(FOutput);
+  InitRequest(FRequest);
   InitResponse(FResponse);
   ARequest:=FRequest;
   AResponse:=FResponse;
@@ -417,8 +449,15 @@ begin
 end;
 
 function TCustomCGIApplication.InitializeWebHandler: TWebHandler;
+
+Var
+  C : TCGIHandlerClass;
+
 begin
-  Result:=TCgiHandler.Create(self);
+  C:=CGIWebHandlerClass;
+  if C=Nil then
+    C:=TCgiHandler;
+  Result:=C.Create(self);
 end;
 
 Procedure TCustomCGIApplication.ShowException(E: Exception);

+ 31 - 3
packages/fcl-web/src/base/custfcgi.pp

@@ -75,6 +75,7 @@ Type
     Property ProtocolOptions : TProtoColOptions read FPO Write FPO;
     Property OnUnknownRecord : TUnknownRecordEvent Read FUR Write FUR;
   end;
+  TFCGIRequestClass = Class of TFCGIRequest;
 
   { TFCGIResponse }
 
@@ -88,6 +89,7 @@ Type
     Procedure DoSendContent; override;
     Property ProtocolOptions : TProtoColOptions Read FPO Write FPO;
   end;
+  TFCGIResponseClass = Class of TFCGIResponse;
 
   TReqResp = record
              Request : TFCgiRequest;
@@ -141,6 +143,7 @@ Type
     Property OnUnknownRecord : TUnknownRecordEvent Read FOnUnknownRecord Write FOnUnknownRecord;
     Property TimeOut : Integer Read FTimeOut Write FTimeOut;
   end;
+  TFCgiHandlerClass = Class of TFCgiHandler;
 
   { TCustomFCgiApplication }
 
@@ -166,6 +169,11 @@ Type
     Property OnUnknownRecord : TUnknownRecordEvent Read GetOnUnknownRecord Write SetOnUnknownRecord;
   end;
 
+Var
+  FCGIRequestClass : TFCGIRequestClass = TFCGIRequest;
+  FCGIResponseClass : TFCGIResponseClass = TFCGIResponse;
+  FCGIWebHandlerClass : TFCgiHandlerClass = TFCgiHandler;
+
 ResourceString
   SNoInputHandle    = 'Failed to open input-handle passed from server. Socket Error: %d';
   SNoSocket         = 'Failed to open socket. Socket Error: %d';
@@ -824,13 +832,26 @@ end;
 {$endif}
 
 function TFCgiHandler.CreateRequest: TFCGIRequest;
+
+Var
+  C : TFCGIRequestClass;
+
 begin
-  Result := TFCGIRequest.Create;
+  C:=FCGIRequestClass;
+  if (C=Nil) then
+    C:=TFCGIRequest;
+  Result:=C.Create;
 end;
 
 function TFCgiHandler.CreateResponse(ARequest: TFCGIRequest): TFCGIResponse;
+Var
+  C : TFCGIResponseClass;
+
 begin
-  Result := TFCGIResponse.Create(ARequest);
+  C:=FCGIResponseClass;
+  if (C=Nil) then
+    C:=TFCGIResponse;
+  Result := C.Create(ARequest);
 end;
 
 function TFCgiHandler.DoFastCGIRead(AHandle: THandle; var ABuf; ACount: Integer): Integer;
@@ -1050,8 +1071,15 @@ begin
 end;
 
 function TCustomFCgiApplication.InitializeWebHandler: TWebHandler;
+
+Var
+  C : TFCGIHandlerClass;
+
 begin
-  Result:=TFCgiHandler.Create(self);
+  C:=FCGIWebHandlerClass;
+  If C=Nil then
+    C:=TFCgiHandler;
+  Result:=C.Create(self);
 end;
 
 end.