threadedhttpserver.pas 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. program threadedhttpserver;
  2. {$mode objfpc}{$H+}
  3. {$define UseCThreads}
  4. uses
  5. {$IFDEF UNIX}{$IFDEF UseCThreads}
  6. cthreads,
  7. {$ENDIF}{$ENDIF}
  8. sysutils, Classes, fphttpserver, fpmimetypes, testhttpserver, syncobjs, ssockets;
  9. Type
  10. THTTPServer = class(TTestHTTPServer)
  11. protected
  12. function CreateConnection(Data: TSocketStream): TFPHTTPConnection; override;
  13. end;
  14. TServerThread = class(TThread)
  15. private
  16. FCSWriteln: TCriticalSection;
  17. FServ : THTTPServer;
  18. procedure ServOnIdle(Sender: TObject);
  19. procedure WriteInfo(S: string);
  20. public
  21. procedure Execute; override;
  22. constructor Create(CreateSuspended: Boolean; const StackSize: SizeUInt = DefaultStackSize);
  23. destructor Destroy; override;
  24. end;
  25. { THTTPServer }
  26. function THTTPServer.CreateConnection(Data: TSocketStream): TFPHTTPConnection;
  27. begin
  28. Result := inherited CreateConnection(Data);
  29. Result.Socket.IOTimeout := 15*1000;
  30. Result.EnableKeepAlive := True;
  31. Result.KeepAliveTimeout := 60*1000;
  32. end;
  33. { TServerThread }
  34. constructor TServerThread.Create(CreateSuspended: Boolean; const StackSize: SizeUInt);
  35. begin
  36. inherited;
  37. FCSWriteln := TCriticalSection.Create;
  38. FServ:=THTTPServer.Create(Nil);
  39. FServ.BaseDir:=ExtractFilePath(ParamStr(0));
  40. {$ifdef unix}
  41. FServ.MimeTypesFile:='/etc/mime.types';
  42. {$endif}
  43. FServ.Threaded:=True;
  44. FServ.Port:=8080;
  45. FServ.WriteInfo := @WriteInfo;
  46. FServ.AcceptIdleTimeout := 500;
  47. FServ.OnAcceptIdle := @ServOnIdle;
  48. end;
  49. destructor TServerThread.Destroy;
  50. begin
  51. FCSWriteln.Free;
  52. FServ.Free;
  53. inherited Destroy;
  54. end;
  55. procedure TServerThread.Execute;
  56. begin
  57. FServ.Active:=True;
  58. end;
  59. procedure TServerThread.ServOnIdle(Sender: TObject);
  60. begin
  61. if Terminated then
  62. FServ.Active := False;
  63. end;
  64. procedure TServerThread.WriteInfo(S: string);
  65. begin
  66. FCSWriteln.Enter;
  67. WriteLn(S);
  68. FCSWriteln.Leave;
  69. end;
  70. var
  71. T: TServerThread;
  72. begin
  73. T := TServerThread.Create(True);
  74. T.FreeOnTerminate := False;
  75. T.Start;
  76. WriteLn('Press enter to close server.');
  77. ReadLn;
  78. T.Terminate;
  79. T.WaitFor;
  80. T.Free;
  81. end.