threadedhttpserver.pas 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. public
  14. Property ConnectionCount;
  15. end;
  16. TServerThread = class(TThread)
  17. private
  18. FCSWriteln: TCriticalSection;
  19. FServ : THTTPServer;
  20. procedure ServOnIdle(Sender: TObject);
  21. procedure WriteInfo(S: string);
  22. public
  23. procedure Execute; override;
  24. constructor Create(CreateSuspended: Boolean; const StackSize: SizeUInt = DefaultStackSize);
  25. destructor Destroy; override;
  26. end;
  27. { THTTPServer }
  28. function THTTPServer.CreateConnection(Data: TSocketStream): TFPHTTPConnection;
  29. begin
  30. Result := inherited CreateConnection(Data);
  31. Result.Socket.IOTimeout := 180*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.KeepConnections := True;
  44. FServ.KeepConnectionTimeout := 60*1000;
  45. FServ.ThreadMode:=tmThread;
  46. FServ.Port:=8080;
  47. FServ.WriteInfo := @WriteInfo;
  48. FServ.AcceptIdleTimeout := 1000;
  49. FServ.OnAcceptIdle := @ServOnIdle;
  50. end;
  51. destructor TServerThread.Destroy;
  52. begin
  53. FCSWriteln.Free;
  54. FServ.Free;
  55. inherited Destroy;
  56. end;
  57. procedure TServerThread.Execute;
  58. begin
  59. FServ.Active:=True;
  60. end;
  61. procedure TServerThread.ServOnIdle(Sender: TObject);
  62. begin
  63. WriteInfo('Active connections: '+IntToStr(FServ.ConnectionCount));
  64. if Terminated then
  65. FServ.Active := False;
  66. end;
  67. procedure TServerThread.WriteInfo(S: string);
  68. begin
  69. FCSWriteln.Enter;
  70. WriteLn(S);
  71. FCSWriteln.Leave;
  72. end;
  73. var
  74. T: TServerThread;
  75. begin
  76. T := TServerThread.Create(True);
  77. T.FreeOnTerminate := False;
  78. T.Start;
  79. WriteLn('Press enter to close server.');
  80. ReadLn;
  81. T.Terminate;
  82. T.WaitFor;
  83. T.Free;
  84. end.