Преглед на файлове

* Made creating socket handler configurable

git-svn-id: trunk@27570 -
michael преди 11 години
родител
ревизия
cd05deafc2
променени са 1 файла, в които са добавени 21 реда и са изтрити 4 реда
  1. 21 4
      packages/fcl-web/src/base/fphttpclient.pp

+ 21 - 4
packages/fcl-web/src/base/fphttpclient.pp

@@ -40,6 +40,8 @@ Type
   // During read of content, of Server did not specify contentlength, -1 is passed.
   // CurrentPos is reset to 0 when the actual content is read, i.e. it is the position in the data, discarding header size.
   TDataEvent   = Procedure (Sender : TObject; Const ContentLength, CurrentPos : Int64) of object;
+  // Use this to set up a socket handler. UseSSL is true if protocol was https
+  TGetSocketHandlerEvent = Procedure (Sender : TObject; Const UseSSL : Boolean; Out AHandler : TSocketHandler) of object;
 
   { TFPCustomHTTPClient }
   TFPCustomHTTPClient = Class(TComponent)
@@ -65,6 +67,7 @@ Type
     FSocket : TInetSocket;
     FBuffer : Ansistring;
     FUserName: String;
+    FOnGetSocketHandler : TGetSocketHandlerEvent;
     function CheckContentLength: Int64;
     function CheckTransferEncoding: string;
     function GetCookies: TStrings;
@@ -101,6 +104,8 @@ Type
     Procedure DoMethod(Const AMethod,AURL : String; Stream : TStream; Const AllowedResponseCodes : Array of Integer); virtual;
     // Send request to server: construct request line and send headers and request body.
     Procedure SendRequest(const AMethod: String; URI: TURI); virtual;
+    // Create socket handler for protocol AProtocol. Calls OnGetSocketHandler.
+    Function GetSocketHandler(Const UseSSL : Boolean) : TSocketHandler;  virtual;
   Public
     Constructor Create(AOwner: TComponent); override;
     Destructor Destroy; override;
@@ -239,6 +244,8 @@ Type
     Property OnDataReceived : TDataEvent Read FOnDataReceived Write FOnDataReceived;
     // Called when headers have been processed.
     Property OnHeaders : TNotifyEvent Read FOnHeaders Write FOnHeaders;
+    // Called to create socket handler. If not set, or Nil is returned, a standard socket handler is created.
+    Property OnGetSocketHandler : TGetSocketHandlerEvent Read FOnGetSocketHandler Write FOnGetSocketHandler;
   end;
 
 
@@ -411,6 +418,19 @@ begin
     Result:=Result+'?'+URI.Params;
 end;
 
+Function TFPCustomHTTPClient.GetSocketHandler(Const UseSSL : Boolean) : TSocketHandler;
+
+begin
+  Result:=Nil;
+  if Assigned(FonGetSocketHandler) then
+    FOnGetSocketHandler(Self,UseSSL,Result);
+  if (Result=Nil) then  
+    If UseSSL then
+      Result:=TSSLSocketHandler.Create
+    else
+      Result:=TSocketHandler.Create;
+end;
+
 procedure TFPCustomHTTPClient.ConnectToServer(const AHost: String;
   APort: Integer; UseSSL : Boolean = False);
 
@@ -424,10 +444,7 @@ begin
       Aport:=443
     else
       Aport:=80;
-  If UseSSL then
-    G:=TSSLSocketHandler.Create
-  else
-    G:=TSocketHandler.Create;
+  G:=GetSocketHandler(UseSSL);    
   FSocket:=TInetSocket.Create(AHost,APort,G);
   FSocket.Connect;
 end;