threadedhttpserver.pas 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. { TServerThread }
  22. constructor TServerThread.Create(CreateSuspended: Boolean; const StackSize: SizeUInt);
  23. begin
  24. inherited;
  25. FCSWriteln := TCriticalSection.Create;
  26. FServ:=TTestHTTPServer.Create(Nil);
  27. FServ.BaseDir:=ExtractFilePath(ParamStr(0));
  28. {$ifdef unix}
  29. FServ.MimeTypesFile:='/etc/mime.types';
  30. {$endif}
  31. FServ.Threaded:=True;
  32. FServ.KeepAliveEnabled:=True;
  33. FServ.KeepAliveTimeout:=60*1000;
  34. FServ.Port:=8080;
  35. FServ.WriteInfo := @WriteInfo;
  36. FServ.AcceptIdleTimeout := 500;
  37. FServ.OnAcceptIdle := @ServOnIdle;
  38. end;
  39. destructor TServerThread.Destroy;
  40. begin
  41. FCSWriteln.Free;
  42. FServ.Free;
  43. inherited Destroy;
  44. end;
  45. procedure TServerThread.Execute;
  46. begin
  47. FServ.Active:=True;
  48. end;
  49. procedure TServerThread.ServOnIdle(Sender: TObject);
  50. begin
  51. if Terminated then
  52. FServ.Active := False;
  53. end;
  54. procedure TServerThread.WriteInfo(S: string);
  55. begin
  56. FCSWriteln.Enter;
  57. WriteLn(S);
  58. FCSWriteln.Leave;
  59. end;
  60. var
  61. T: TServerThread;
  62. begin
  63. T := TServerThread.Create(True);
  64. T.FreeOnTerminate := False;
  65. T.Start;
  66. WriteLn('Press enter to close server.');
  67. ReadLn;
  68. T.Terminate;
  69. T.WaitFor;
  70. T.Free;
  71. end.