threadedhttpserver.pas 2.0 KB

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