Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program testserver;
- {$mode objfpc}{$H+}
- {$R *.res}
- uses
- {$IFDEF Unix}CThreads,{$ENDIF} Classes, SysUtils, custhttpapp, fphttpserver, httproute,
- HTTPDefs, ssockets;
- type
- { TSseResponse }
- TSseResponse = class(TFPHTTPConnectionResponse)
- private
- FStreaming:boolean;
- procedure SetStreaming(AValue: boolean);
- protected
- procedure DoSendContent; override;
- public
- property Streaming:boolean read FStreaming write SetStreaming;
- end;
- { TSseServer }
- TSseServer = class(TEmbeddedHttpServer)
- protected
- Function CreateResponse(ARequest: TFPHTTPConnectionRequest
- ): TFPHTTPConnectionResponse; override;
- end;
- { TSseServerHandler }
- TSseServerHandler = class(TFPHTTPServerHandler)
- protected
- Function CreateServer : TEmbeddedHttpServer; override;
- end;
- TServerThread = class(TThread)
- private
- FServer:TSseServerHandler;
- procedure stop;
- procedure ManageRequest(ARequest:TRequest; AResponse:TResponse);
- protected
- procedure Execute;override;
- public
- constructor Create;
- end;
- { TSseResponse }
- procedure TSseResponse.SetStreaming(AValue: boolean);
- begin
- FStreaming:=AValue;
- if FStreaming then
- begin
- ContentType:='text/event-stream';
- SetCustomHeader('Access-Control-Allow-Origin', '*');
- end;
- end;
- procedure TSseResponse.DoSendContent;
- var
- buffer: String;
- sent: LongInt;
- begin
- if Fstreaming then
- begin
- buffer:='data: test'+#13#10#13#10;
- repeat
- sleep(1000);
- sent:=Connection.Socket.Write(buffer[1],length(buffer));
- until sent<=0;
- end else
- Inherited;
- end;
- { TSseServer }
- function TSseServer.CreateResponse(ARequest: TFPHTTPConnectionRequest
- ): TFPHTTPConnectionResponse;
- begin
- Result:=TSseResponse.Create(ARequest);
- end;
- { TSseServerHandler }
- function TSseServerHandler.CreateServer: TEmbeddedHttpServer;
- begin
- Result:=TSseServer.Create(self);
- end;
- procedure SendFile(Const AFileName : String; AResponse : TResponse);
- Var
- F : TFileStream;
- extension: String;
- begin
- extension:=ExtractFileExt(AFilename);
- case extension of
- '.html','.htm': AResponse.ContentType:='text/html';
- '.css': AResponse.ContentType:='text/css';
- '.js' : AResponse.ContentType:='text/javascript';
- else AResponse.ContentType:='application/octet-stream';
- end;
- F:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);
- try
- AResponse.ContentLength:=F.Size;
- AResponse.ContentStream:=F;
- AResponse.SendContent;
- AResponse.ContentStream:=Nil;
- finally
- F.Free;
- end;
- end;
- procedure TServerThread.ManageRequest(ARequest: TRequest; AResponse: TResponse);
- var
- path: String;
- begin
- Writeln('new request for ',ARequest.PathInfo);
- path:=ExtractFilePath(ParamStr(0))+ARequest.PathInfo;
- if FileExists(path) then
- begin
- SendFile(path,AResponse);
- end else
- if ARequest.pathinfo='/'+paramstr(1) then
- begin
- TSseResponse(AResponse).Streaming:=true;
- AResponse.SendContent;
- end else
- begin
- AResponse.Code:=404;
- Aresponse.CodeText:='Not found';
- Aresponse.SendContent;
- end;
- end;
- procedure TServerThread.Execute;
- begin
- httprouter.RegisterRoute('*',@ManageRequest);
- FServer:=TSseServerHandler.Create(nil);
- FServer.Port:=8080;
- FServer.Threaded:=true;
- FServer.Run;
- end;
- constructor TServerThread.Create;
- begin
- inherited Create(false);
- end;
- procedure TServerThread.stop;
- begin
- FServer.Terminate;
- try
- TInetSocket.Create('localhost',Fserver.Port).Free;
- except
- // Ignore errors this may raise.
- end
- end;
- var
- Server:TServerThread;
- begin
- Server:=TServerThread.Create;
- writeln('press enter to stop');
- readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement