Advertisement
Guest User

Untitled

a guest
Sep 1st, 2021
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.69 KB | None | 0 0
  1. program testserver;
  2. {$mode objfpc}{$H+}
  3. {$R *.res}
  4.  
  5. uses
  6.   {$IFDEF Unix}CThreads,{$ENDIF} Classes, SysUtils, custhttpapp, fphttpserver, httproute,
  7.   HTTPDefs, ssockets;
  8.  
  9.  
  10. type
  11.  
  12.  { TSseResponse }
  13.  
  14.  TSseResponse = class(TFPHTTPConnectionResponse)
  15.  private
  16.    FStreaming:boolean;
  17.    procedure SetStreaming(AValue: boolean);
  18.  protected
  19.    procedure DoSendContent; override;
  20.  public
  21.    property Streaming:boolean read FStreaming write SetStreaming;
  22.  end;
  23.  
  24.  { TSseServer }
  25.  
  26.  TSseServer = class(TEmbeddedHttpServer)
  27.    protected
  28.      Function CreateResponse(ARequest: TFPHTTPConnectionRequest
  29.        ): TFPHTTPConnectionResponse; override;
  30.  end;
  31.  
  32.  { TSseServerHandler }
  33.  
  34.  TSseServerHandler = class(TFPHTTPServerHandler)
  35.  protected
  36.    Function CreateServer : TEmbeddedHttpServer; override;
  37.  end;
  38.  
  39.  
  40.  TServerThread = class(TThread)
  41.  private
  42.    FServer:TSseServerHandler;
  43.    procedure stop;
  44.    procedure ManageRequest(ARequest:TRequest; AResponse:TResponse);
  45.  protected
  46.    procedure Execute;override;
  47.  public
  48.    constructor Create;
  49.  end;
  50.  
  51.  { TSseResponse }
  52.  
  53.  procedure TSseResponse.SetStreaming(AValue: boolean);
  54.  begin
  55.    FStreaming:=AValue;
  56.    if FStreaming then
  57.    begin
  58.      ContentType:='text/event-stream';
  59.      SetCustomHeader('Access-Control-Allow-Origin', '*');
  60.    end;
  61.  end;
  62.  
  63.  procedure TSseResponse.DoSendContent;
  64.  var
  65.    buffer: String;
  66.    sent: LongInt;
  67.  begin
  68.   if Fstreaming then
  69.   begin
  70.     buffer:='data: test'+#13#10#13#10;
  71.     repeat
  72.       sleep(1000);
  73.       sent:=Connection.Socket.Write(buffer[1],length(buffer));
  74.     until sent<=0;
  75.   end else
  76.     Inherited;
  77.  end;
  78.  
  79.  { TSseServer }
  80.  
  81.  function TSseServer.CreateResponse(ARequest: TFPHTTPConnectionRequest
  82.    ): TFPHTTPConnectionResponse;
  83.  begin
  84.    Result:=TSseResponse.Create(ARequest);
  85.  end;
  86.  
  87.  { TSseServerHandler }
  88.  
  89.  function TSseServerHandler.CreateServer: TEmbeddedHttpServer;
  90.  begin
  91.    Result:=TSseServer.Create(self);
  92.  end;
  93.  
  94. procedure SendFile(Const AFileName : String; AResponse : TResponse);
  95. Var
  96.   F : TFileStream;
  97.   extension: String;
  98. begin
  99.   extension:=ExtractFileExt(AFilename);
  100.   case extension of
  101.     '.html','.htm': AResponse.ContentType:='text/html';
  102.     '.css': AResponse.ContentType:='text/css';
  103.     '.js' : AResponse.ContentType:='text/javascript';
  104.     else AResponse.ContentType:='application/octet-stream';
  105.   end;
  106.   F:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);
  107.   try
  108.     AResponse.ContentLength:=F.Size;
  109.     AResponse.ContentStream:=F;
  110.     AResponse.SendContent;
  111.     AResponse.ContentStream:=Nil;
  112.   finally
  113.     F.Free;
  114.   end;
  115. end;
  116.  
  117. procedure TServerThread.ManageRequest(ARequest: TRequest; AResponse: TResponse);
  118. var
  119.   path: String;
  120. begin
  121.  Writeln('new request for ',ARequest.PathInfo);
  122.  path:=ExtractFilePath(ParamStr(0))+ARequest.PathInfo;
  123.  if FileExists(path) then
  124.  begin
  125.    SendFile(path,AResponse);
  126.  end else
  127.  if ARequest.pathinfo='/'+paramstr(1) then
  128.  begin
  129.    TSseResponse(AResponse).Streaming:=true;
  130.    AResponse.SendContent;
  131.  end else
  132.  begin
  133.    AResponse.Code:=404;
  134.    Aresponse.CodeText:='Not found';
  135.    Aresponse.SendContent;
  136.  end;
  137. end;
  138.  
  139. procedure TServerThread.Execute;
  140. begin
  141.   httprouter.RegisterRoute('*',@ManageRequest);
  142.   FServer:=TSseServerHandler.Create(nil);
  143.   FServer.Port:=8080;
  144.   FServer.Threaded:=true;
  145.   FServer.Run;
  146. end;
  147.  
  148. constructor TServerThread.Create;
  149. begin
  150.   inherited Create(false);
  151. end;
  152.  
  153. procedure TServerThread.stop;
  154. begin
  155.   FServer.Terminate;
  156.   try
  157.     TInetSocket.Create('localhost',Fserver.Port).Free;
  158.   except
  159.     // Ignore errors this may raise.
  160.   end
  161. end;
  162.  
  163.  
  164. var
  165.   Server:TServerThread;
  166. begin
  167.   Server:=TServerThread.Create;
  168.   writeln('press enter to stop');
  169.   readln;
  170. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement