mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 14:29:13 +02:00
httpserver keep-alive first attempt
This commit is contained in:
parent
6b36229d3c
commit
7fbc82a9ff
@ -99,6 +99,7 @@ type
|
|||||||
Constructor Create (AHandle : Longint; AHandler : TSocketHandler = Nil);virtual;
|
Constructor Create (AHandle : Longint; AHandler : TSocketHandler = Nil);virtual;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function Seek(Offset: Longint; Origin: Word): Longint; override;
|
function Seek(Offset: Longint; Origin: Word): Longint; override;
|
||||||
|
Function CanRead(TimeOut : Integer): Boolean;
|
||||||
Function Read (Var Buffer; Count : Longint) : longint; Override;
|
Function Read (Var Buffer; Count : Longint) : longint; Override;
|
||||||
Function Write (Const Buffer; Count : Longint) :Longint; Override;
|
Function Write (Const Buffer; Count : Longint) :Longint; Override;
|
||||||
Property SocketOptions : TSocketOptions Read FSocketOptions
|
Property SocketOptions : TSocketOptions Read FSocketOptions
|
||||||
@ -484,6 +485,18 @@ begin
|
|||||||
Result:=0;
|
Result:=0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Function TSocketStream.CanRead (TimeOut : Integer) : Boolean;
|
||||||
|
var
|
||||||
|
B: Byte;
|
||||||
|
lTM: Integer;
|
||||||
|
begin
|
||||||
|
lTM := IOTimeout;
|
||||||
|
IOTimeout := TimeOut;
|
||||||
|
FHandler.Recv(B,0);
|
||||||
|
Result := FHandler.FLastError=0;
|
||||||
|
IOTimeout := lTM;
|
||||||
|
end;
|
||||||
|
|
||||||
Function TSocketStream.Read (Var Buffer; Count : Longint) : longint;
|
Function TSocketStream.Read (Var Buffer; Count : Longint) : longint;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -63,7 +63,9 @@ Type
|
|||||||
FOnError: TRequestErrorHandler;
|
FOnError: TRequestErrorHandler;
|
||||||
FServer: TFPCustomHTTPServer;
|
FServer: TFPCustomHTTPServer;
|
||||||
FSocket: TSocketStream;
|
FSocket: TSocketStream;
|
||||||
|
FSetupSocket : Boolean;
|
||||||
FBuffer : Ansistring;
|
FBuffer : Ansistring;
|
||||||
|
FKeepAlive : Boolean;
|
||||||
procedure InterPretHeader(ARequest: TFPHTTPConnectionRequest; const AHeader: String);
|
procedure InterPretHeader(ARequest: TFPHTTPConnectionRequest; const AHeader: String);
|
||||||
function ReadString: String;
|
function ReadString: String;
|
||||||
Function GetLookupHostNames : Boolean;
|
Function GetLookupHostNames : Boolean;
|
||||||
@ -81,6 +83,7 @@ Type
|
|||||||
Property Server : TFPCustomHTTPServer Read FServer;
|
Property Server : TFPCustomHTTPServer Read FServer;
|
||||||
Property OnRequestError : TRequestErrorHandler Read FOnError Write FOnError;
|
Property OnRequestError : TRequestErrorHandler Read FOnError Write FOnError;
|
||||||
Property LookupHostNames : Boolean Read GetLookupHostNames;
|
Property LookupHostNames : Boolean Read GetLookupHostNames;
|
||||||
|
property KeepAlive: Boolean read FKeepAlive;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFPHTTPConnectionThread }
|
{ TFPHTTPConnectionThread }
|
||||||
@ -525,6 +528,7 @@ end;
|
|||||||
constructor TFPHTTPConnection.Create(AServer: TFPCustomHttpServer; ASocket: TSocketStream);
|
constructor TFPHTTPConnection.Create(AServer: TFPCustomHttpServer; ASocket: TSocketStream);
|
||||||
begin
|
begin
|
||||||
FSocket:=ASocket;
|
FSocket:=ASocket;
|
||||||
|
FSetupSocket:=True;
|
||||||
FServer:=AServer;
|
FServer:=AServer;
|
||||||
If Assigned(FServer) then
|
If Assigned(FServer) then
|
||||||
InterLockedIncrement(FServer.FConnectionCount)
|
InterLockedIncrement(FServer.FConnectionCount)
|
||||||
@ -555,7 +559,15 @@ Var
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
Try
|
Try
|
||||||
SetupSocket;
|
if FSetupSocket then
|
||||||
|
begin
|
||||||
|
SetupSocket;
|
||||||
|
FSetupSocket:=False;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
if not Socket.CanRead(1000) then
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
// Read headers.
|
// Read headers.
|
||||||
Req:=ReadRequestHeaders;
|
Req:=ReadRequestHeaders;
|
||||||
try
|
try
|
||||||
@ -565,6 +577,12 @@ begin
|
|||||||
If Req.ContentLength>0 then
|
If Req.ContentLength>0 then
|
||||||
ReadRequestContent(Req);
|
ReadRequestContent(Req);
|
||||||
Req.InitRequestVars;
|
Req.InitRequestVars;
|
||||||
|
// Read out keep-alive
|
||||||
|
FKeepAlive:=Req.HttpVersion='1.1'; // keep-alive is default on HTTP 1.1
|
||||||
|
if SameText(Req.GetHeader(hhConnection),'close') then
|
||||||
|
FKeepAlive:=False
|
||||||
|
else if SameText(Req.GetHeader(hhConnection),'keep-alive') then
|
||||||
|
FKeepAlive:=True;
|
||||||
// Create Response
|
// Create Response
|
||||||
Resp:= Server.CreateResponse(Req);
|
Resp:= Server.CreateResponse(Req);
|
||||||
try
|
try
|
||||||
@ -574,7 +592,12 @@ begin
|
|||||||
if Server.Active then
|
if Server.Active then
|
||||||
Server.HandleRequest(Req,Resp);
|
Server.HandleRequest(Req,Resp);
|
||||||
if Assigned(Resp) and (not Resp.ContentSent) then
|
if Assigned(Resp) and (not Resp.ContentSent) then
|
||||||
|
begin
|
||||||
|
// Add connection header for HTTP 1.0 keep-alive
|
||||||
|
if FKeepAlive and (Req.HttpVersion='1.0') and not Resp.HeaderIsSet(hhConnection) then
|
||||||
|
Resp.SetHeader(hhConnection,'keep-alive');
|
||||||
Resp.SendContent;
|
Resp.SendContent;
|
||||||
|
end;
|
||||||
finally
|
finally
|
||||||
FreeAndNil(Resp);
|
FreeAndNil(Resp);
|
||||||
end;
|
end;
|
||||||
@ -609,7 +632,9 @@ procedure TFPHTTPConnectionThread.Execute;
|
|||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
try
|
try
|
||||||
FConnection.HandleRequest;
|
repeat
|
||||||
|
FConnection.HandleRequest;
|
||||||
|
until not (FConnection.KeepAlive and (FConnection.Socket.LastError=0));
|
||||||
finally
|
finally
|
||||||
FreeAndNil(FConnection);
|
FreeAndNil(FConnection);
|
||||||
if Assigned(FThreadList) then
|
if Assigned(FThreadList) then
|
||||||
|
Loading…
Reference in New Issue
Block a user