|
@@ -89,7 +89,7 @@ Type
|
|
// Read the request content
|
|
// Read the request content
|
|
procedure ReadRequestContent(ARequest: TFPHTTPConnectionRequest); virtual;
|
|
procedure ReadRequestContent(ARequest: TFPHTTPConnectionRequest); virtual;
|
|
// Allow descendents to handle unknown headers
|
|
// Allow descendents to handle unknown headers
|
|
- procedure UnknownHeader(ARequest: TFPHTTPConnectionRequest; const AHeader: String); virtual;
|
|
|
|
|
|
+ procedure UnknownHeader({%H-}ARequest: TFPHTTPConnectionRequest; const {%H-}AHeader: String); virtual;
|
|
// Handle request error, calls OnRequestError
|
|
// Handle request error, calls OnRequestError
|
|
procedure HandleRequestError(E : Exception); virtual;
|
|
procedure HandleRequestError(E : Exception); virtual;
|
|
// Handle unexpected error, calls OnUnexpectedError
|
|
// Handle unexpected error, calls OnUnexpectedError
|
|
@@ -190,13 +190,12 @@ Type
|
|
|
|
|
|
TFPHTTPServerConnectionListHandler = Class(TFPHTTPServerConnectionHandler)
|
|
TFPHTTPServerConnectionListHandler = Class(TFPHTTPServerConnectionHandler)
|
|
Private
|
|
Private
|
|
-
|
|
|
|
FList: TConnectionList;
|
|
FList: TConnectionList;
|
|
Protected
|
|
Protected
|
|
Type
|
|
Type
|
|
TConnectionIterator = Procedure (aConnection :TFPHTTPConnection; var aContinue : boolean) of object;
|
|
TConnectionIterator = Procedure (aConnection :TFPHTTPConnection; var aContinue : boolean) of object;
|
|
Function CreateList : TConnectionList;
|
|
Function CreateList : TConnectionList;
|
|
- Procedure CloseConnectionSocket(aConnection :TFPHTTPConnection; var aContinue : boolean);
|
|
|
|
|
|
+ Procedure CloseConnectionSocket(aConnection :TFPHTTPConnection; var {%H-}aContinue : boolean);
|
|
Procedure Foreach(aIterator : TConnectionIterator);
|
|
Procedure Foreach(aIterator : TConnectionIterator);
|
|
Procedure RemoveConnection(aConnection :TFPHTTPConnection); override;
|
|
Procedure RemoveConnection(aConnection :TFPHTTPConnection); override;
|
|
Public
|
|
Public
|
|
@@ -255,8 +254,8 @@ Type
|
|
Property OnDone : TNotifyEvent Read FOnDone;
|
|
Property OnDone : TNotifyEvent Read FOnDone;
|
|
end;
|
|
end;
|
|
procedure ConnectionDone(Sender: TObject); virtual;
|
|
procedure ConnectionDone(Sender: TObject); virtual;
|
|
- procedure ScheduleRequest(aConnection: TFPHTTPConnection);virtual;
|
|
|
|
- procedure CheckRequest(aConnection: TFPHTTPConnection; var aContinue : Boolean);virtual;
|
|
|
|
|
|
+ procedure ScheduleRequest(aConnection: TFPHTTPConnection); virtual;
|
|
|
|
+ procedure CheckRequest(aConnection: TFPHTTPConnection; var {%H-}aContinue: Boolean); virtual;
|
|
Public
|
|
Public
|
|
Procedure CloseSockets; override;
|
|
Procedure CloseSockets; override;
|
|
procedure CheckRequests; override;
|
|
procedure CheckRequests; override;
|
|
@@ -300,7 +299,6 @@ Type
|
|
|
|
|
|
{ TConnectionList }
|
|
{ TConnectionList }
|
|
|
|
|
|
-
|
|
|
|
THTTPLogEvent = Procedure (aSender : TObject; aType: TEventType; Const Msg : String) of object;
|
|
THTTPLogEvent = Procedure (aSender : TObject; aType: TEventType; Const Msg : String) of object;
|
|
// Events in the lifetime of a request that are logged
|
|
// Events in the lifetime of a request that are logged
|
|
THTTPLogMoment = (hlmStartSocket,hlmCloseSocket,hlmConnect,hlmNoHTTPProtocol, hlmEmptyRequest, hlmRequestStart,hlmHeaders,hlmRequestDone,hlmUpgrade,hlmDisconnect,hlmError);
|
|
THTTPLogMoment = (hlmStartSocket,hlmCloseSocket,hlmConnect,hlmNoHTTPProtocol, hlmEmptyRequest, hlmRequestStart,hlmHeaders,hlmRequestDone,hlmUpgrade,hlmDisconnect,hlmError);
|
|
@@ -347,7 +345,7 @@ Type
|
|
procedure SetActive(const AValue: Boolean);
|
|
procedure SetActive(const AValue: Boolean);
|
|
procedure SetCertificateData(AValue: TCertificateData);
|
|
procedure SetCertificateData(AValue: TCertificateData);
|
|
procedure SetHostName(const AValue: string);
|
|
procedure SetHostName(const AValue: string);
|
|
- procedure SetIdle(AValue: TNotifyEvent);
|
|
|
|
|
|
+ procedure SetIdle(const AValue: TNotifyEvent);
|
|
procedure SetOnAllowConnect(const AValue: TConnectQuery);
|
|
procedure SetOnAllowConnect(const AValue: TConnectQuery);
|
|
procedure SetAddress(const AValue: string);
|
|
procedure SetAddress(const AValue: string);
|
|
procedure SetPort(const AValue: Word);
|
|
procedure SetPort(const AValue: Word);
|
|
@@ -364,9 +362,9 @@ Type
|
|
Procedure DoLog(aMoment : THTTPLogMoment; const Fmt : String; Const Args : Array of const); overload;
|
|
Procedure DoLog(aMoment : THTTPLogMoment; const Fmt : String; Const Args : Array of const); overload;
|
|
Function CheckUpgrade(aConnection : TFPHTTPConnection; aRequest : TFPHTTPConnectionRequest) : Boolean;
|
|
Function CheckUpgrade(aConnection : TFPHTTPConnection; aRequest : TFPHTTPConnectionRequest) : Boolean;
|
|
// Override this to create Descendent
|
|
// Override this to create Descendent
|
|
- Function CreateUpgradeHandlerList : TUpgradeHandlerList;
|
|
|
|
|
|
+ Function CreateUpgradeHandlerList : TUpgradeHandlerList; virtual;
|
|
// Override this to create descendent
|
|
// Override this to create descendent
|
|
- function CreateSSLSocketHandler: TSocketHandler;
|
|
|
|
|
|
+ function CreateSSLSocketHandler: TSocketHandler; virtual;
|
|
// Override this to create descendent
|
|
// Override this to create descendent
|
|
Function CreateCertificateData : TCertificateData; virtual;
|
|
Function CreateCertificateData : TCertificateData; virtual;
|
|
// Override this to create descendent
|
|
// Override this to create descendent
|
|
@@ -374,20 +372,20 @@ Type
|
|
// Override these to create descendents of the request/response instead.
|
|
// Override these to create descendents of the request/response instead.
|
|
Function CreateRequest : TFPHTTPConnectionRequest; virtual;
|
|
Function CreateRequest : TFPHTTPConnectionRequest; virtual;
|
|
Function CreateResponse(ARequest : TFPHTTPConnectionRequest) : TFPHTTPConnectionResponse; virtual;
|
|
Function CreateResponse(ARequest : TFPHTTPConnectionRequest) : TFPHTTPConnectionResponse; virtual;
|
|
- Procedure InitRequest(ARequest : TFPHTTPConnectionRequest); virtual;
|
|
|
|
- Procedure InitResponse(AResponse : TFPHTTPConnectionResponse); virtual;
|
|
|
|
|
|
+ Procedure InitRequest({%H-}ARequest : TFPHTTPConnectionRequest); virtual;
|
|
|
|
+ Procedure InitResponse({%H-}AResponse : TFPHTTPConnectionResponse); virtual;
|
|
// Called on accept errors
|
|
// Called on accept errors
|
|
- procedure DoAcceptError(Sender: TObject; ASocket: Longint; E: Exception; var ErrorAction: TAcceptErrorAction);
|
|
|
|
|
|
+ procedure DoAcceptError(Sender: TObject; {%H-}ASocket: Longint; {%H-}E: Exception; var ErrorAction: TAcceptErrorAction); virtual;
|
|
// Called when accept is idle. Will check for new requests.
|
|
// Called when accept is idle. Will check for new requests.
|
|
- procedure DoAcceptIdle(Sender: TObject);
|
|
|
|
|
|
+ procedure DoAcceptIdle(Sender: TObject); virtual;
|
|
// Called when KeepConnection is idle.
|
|
// Called when KeepConnection is idle.
|
|
- procedure DoKeepConnectionIdle(Sender: TObject);
|
|
|
|
|
|
+ procedure DoKeepConnectionIdle(Sender: TObject); virtual;
|
|
// Create a connection handling object.
|
|
// Create a connection handling object.
|
|
function CreateConnection(Data : TSocketStream) : TFPHTTPConnection; virtual;
|
|
function CreateConnection(Data : TSocketStream) : TFPHTTPConnection; virtual;
|
|
// Create a connection handler object depending on threadmode
|
|
// Create a connection handler object depending on threadmode
|
|
Function CreateConnectionHandler : TFPHTTPServerConnectionHandler; virtual;
|
|
Function CreateConnectionHandler : TFPHTTPServerConnectionHandler; virtual;
|
|
// Check if server is inactive
|
|
// Check if server is inactive
|
|
- Procedure CheckInactive;
|
|
|
|
|
|
+ Procedure CheckInactive; virtual;
|
|
// Called by TInetServer when a new connection is accepted.
|
|
// Called by TInetServer when a new connection is accepted.
|
|
Procedure DoConnect(Sender : TObject; Data : TSocketStream); virtual;
|
|
Procedure DoConnect(Sender : TObject; Data : TSocketStream); virtual;
|
|
// Create and configure TInetServer
|
|
// Create and configure TInetServer
|
|
@@ -424,7 +422,7 @@ Type
|
|
class constructor init;
|
|
class constructor init;
|
|
Constructor Create(AOwner : TComponent); override;
|
|
Constructor Create(AOwner : TComponent); override;
|
|
Destructor Destroy; override;
|
|
Destructor Destroy; override;
|
|
- Function RegisterUpdateHandler(Const aName : string; OnCheck : THandlesUpgradeEvent; OnUpgrade : TUpgradeConnectionEvent) : TUpgradeHandlerItem;
|
|
|
|
|
|
+ Function RegisterUpdateHandler(Const aName : string; const OnCheck : THandlesUpgradeEvent; const OnUpgrade : TUpgradeConnectionEvent) : TUpgradeHandlerItem;
|
|
Procedure UnRegisterUpdateHandler(Const aName : string);
|
|
Procedure UnRegisterUpdateHandler(Const aName : string);
|
|
protected
|
|
protected
|
|
// Set to true to start listening.
|
|
// Set to true to start listening.
|
|
@@ -580,12 +578,13 @@ begin
|
|
Result:=GetHandlerItem(Idx);
|
|
Result:=GetHandlerItem(Idx);
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TUpgradeHandlerList.AddHandler(const aName: String; aOnCheck: THandlesUpgradeEvent; aOnUpgrade: TUpgradeConnectionEvent
|
|
|
|
|
|
+function TUpgradeHandlerList.AddHandler(const aName: String;
|
|
|
|
+ const aOnCheck: THandlesUpgradeEvent; const aOnUpgrade: TUpgradeConnectionEvent
|
|
): TUpgradeHandlerItem;
|
|
): TUpgradeHandlerItem;
|
|
begin
|
|
begin
|
|
if IndexOfName(aName)<>-1 then
|
|
if IndexOfName(aName)<>-1 then
|
|
Raise EHTTPServer.CreateFmt(SErrDuplicateUpgradeHandler,[aName]);
|
|
Raise EHTTPServer.CreateFmt(SErrDuplicateUpgradeHandler,[aName]);
|
|
- Result:=add as TUpgradeHandlerItem;
|
|
|
|
|
|
+ Result:=Add as TUpgradeHandlerItem;
|
|
Result.Name:=aName;
|
|
Result.Name:=aName;
|
|
Result.OnHandleUpgrade:=aOnCheck;
|
|
Result.OnHandleUpgrade:=aOnCheck;
|
|
Result.OnUpgrade:=aOnUpgrade;
|
|
Result.OnUpgrade:=aOnUpgrade;
|
|
@@ -977,7 +976,7 @@ begin
|
|
On E : exception do
|
|
On E : exception do
|
|
HandleUnexpectedError(E);
|
|
HandleUnexpectedError(E);
|
|
end
|
|
end
|
|
- else if Assigned(Server) and Server.CanLog(hlmError) then
|
|
|
|
|
|
+ else if Assigned(Server) and Server.CanLog(hlmError) then
|
|
Server.DoLog(hlmError,SErrorDuringRequest,[E.ClassName,E.Message]);
|
|
Server.DoLog(hlmError,SErrorDuringRequest,[E.ClassName,E.Message]);
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1026,7 +1025,8 @@ begin
|
|
ARequest.SetFieldByName(N,V);
|
|
ARequest.SetFieldByName(N,V);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TFPHTTPConnection.ParseStartLine(Request : TFPHTTPConnectionRequest; AStartLine : String);
|
|
|
|
|
|
+procedure TFPHTTPConnection.ParseStartLine(Request : TFPHTTPConnectionRequest;
|
|
|
|
+ AStartLine : String);
|
|
|
|
|
|
Function GetNextWord(Var S : String) : string;
|
|
Function GetNextWord(Var S : String) : string;
|
|
|
|
|
|
@@ -1468,7 +1468,7 @@ begin
|
|
StartServerSocket;
|
|
StartServerSocket;
|
|
finally
|
|
finally
|
|
FreeServerSocket;
|
|
FreeServerSocket;
|
|
- end
|
|
|
|
|
|
+ end;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
StopServerSocket;
|
|
StopServerSocket;
|
|
@@ -1485,7 +1485,7 @@ begin
|
|
FCertificateData.HostName:=aValue;
|
|
FCertificateData.HostName:=aValue;
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TFPCustomHttpServer.SetIdle(AValue: TNotifyEvent);
|
|
|
|
|
|
+procedure TFPCustomHttpServer.SetIdle(const AValue: TNotifyEvent);
|
|
begin
|
|
begin
|
|
FOnAcceptIdle:=AValue;
|
|
FOnAcceptIdle:=AValue;
|
|
if Assigned(FServer) then
|
|
if Assigned(FServer) then
|
|
@@ -1607,7 +1607,6 @@ begin
|
|
FConnectionHandler:=CreateConnectionHandler();
|
|
FConnectionHandler:=CreateConnectionHandler();
|
|
end;
|
|
end;
|
|
|
|
|
|
-
|
|
|
|
function TFPCustomHttpServer.CanLog(aMoment: THTTPLogMoment): Boolean;
|
|
function TFPCustomHttpServer.CanLog(aMoment: THTTPLogMoment): Boolean;
|
|
begin
|
|
begin
|
|
Result:=aMoment in FLogMoments;
|
|
Result:=aMoment in FLogMoments;
|
|
@@ -1632,13 +1631,11 @@ begin
|
|
DoLog(aMoment,Format(Fmt,Args));
|
|
DoLog(aMoment,Format(Fmt,Args));
|
|
end;
|
|
end;
|
|
|
|
|
|
-
|
|
|
|
function TFPCustomHttpServer.CheckUpgrade(aConnection: TFPHTTPConnection; aRequest: TFPHTTPConnectionRequest): Boolean;
|
|
function TFPCustomHttpServer.CheckUpgrade(aConnection: TFPHTTPConnection; aRequest: TFPHTTPConnectionRequest): Boolean;
|
|
|
|
|
|
Var
|
|
Var
|
|
I : Integer;
|
|
I : Integer;
|
|
Handler : TUpgradeHandlerItem;
|
|
Handler : TUpgradeHandlerItem;
|
|
- S : String;
|
|
|
|
|
|
|
|
begin
|
|
begin
|
|
Result:=HasUpdateHandlers;
|
|
Result:=HasUpdateHandlers;
|
|
@@ -1673,7 +1670,7 @@ end;
|
|
procedure TFPCustomHttpServer.HandleUnexpectedError(Sender: TObject; E: Exception);
|
|
procedure TFPCustomHttpServer.HandleUnexpectedError(Sender: TObject; E: Exception);
|
|
begin
|
|
begin
|
|
if CanLog(hlmError) then
|
|
if CanLog(hlmError) then
|
|
- DoLog(hlmError,SErrorDuringRequest,[E.ClassName,E.Message]);
|
|
|
|
|
|
+ DoLog(hlmError,SErrorDuringRequest,[E.ClassName,E.Message]);
|
|
If Assigned(FOnUnexpectedError) then
|
|
If Assigned(FOnUnexpectedError) then
|
|
FOnUnexpectedError(Sender,E);
|
|
FOnUnexpectedError(Sender,E);
|
|
end;
|
|
end;
|
|
@@ -1800,8 +1797,9 @@ begin
|
|
inherited Destroy;
|
|
inherited Destroy;
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TFPCustomHttpServer.RegisterUpdateHandler(const aName: string; OnCheck: THandlesUpgradeEvent;
|
|
|
|
- OnUpgrade: TUpgradeConnectionEvent): TUpgradeHandlerItem;
|
|
|
|
|
|
+function TFPCustomHttpServer.RegisterUpdateHandler(const aName: string;
|
|
|
|
+ const OnCheck: THandlesUpgradeEvent; const OnUpgrade: TUpgradeConnectionEvent
|
|
|
|
+ ): TUpgradeHandlerItem;
|
|
begin
|
|
begin
|
|
With UpdateHandlers do
|
|
With UpdateHandlers do
|
|
Result:=AddHandler(aName,OnCheck,OnUpgrade)
|
|
Result:=AddHandler(aName,OnCheck,OnUpgrade)
|