simplehttpserver.pas 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. program simplehttpserver;
  2. {$mode objfpc}{$H+}
  3. {$define UseCThreads}
  4. uses
  5. {$IFDEF UNIX}{$IFDEF UseCThreads}
  6. cthreads,
  7. {$ENDIF}{$ENDIF}
  8. sysutils, Classes, fphttpserver, fpmimetypes, wmecho;
  9. Type
  10. { TTestHTTPServer }
  11. TTestHTTPServer = Class(TFPHTTPServer)
  12. private
  13. FBaseDir : String;
  14. FCount : Integer;
  15. FMimeLoaded : Boolean;
  16. FMimeTypesFile: String;
  17. procedure SetBaseDir(const AValue: String);
  18. Protected
  19. Procedure DoIdle(Sender : TObject);
  20. procedure CheckMimeLoaded;
  21. Property MimeLoaded : Boolean Read FMimeLoaded;
  22. public
  23. procedure HandleRequest(Var ARequest: TFPHTTPConnectionRequest;
  24. Var AResponse : TFPHTTPConnectionResponse); override;
  25. Property BaseDir : String Read FBaseDir Write SetBaseDir;
  26. Property MimeTypesFile : String Read FMimeTypesFile Write FMimeTypesFile;
  27. end;
  28. Var
  29. Serv : TTestHTTPServer;
  30. { TTestHTTPServer }
  31. procedure TTestHTTPServer.SetBaseDir(const AValue: String);
  32. begin
  33. if FBaseDir=AValue then exit;
  34. FBaseDir:=AValue;
  35. If (FBaseDir<>'') then
  36. FBaseDir:=IncludeTrailingPathDelimiter(FBaseDir);
  37. end;
  38. procedure TTestHTTPServer.DoIdle(Sender: TObject);
  39. begin
  40. Writeln('Idle, waiting for connections');
  41. end;
  42. procedure TTestHTTPServer.CheckMimeLoaded;
  43. begin
  44. If (Not MimeLoaded) and (MimeTypesFile<>'') then
  45. begin
  46. MimeTypes.LoadFromFile(MimeTypesFile);
  47. FMimeLoaded:=true;
  48. end;
  49. end;
  50. procedure TTestHTTPServer.HandleRequest(var ARequest: TFPHTTPConnectionRequest;
  51. var AResponse: TFPHTTPConnectionResponse);
  52. Var
  53. F : TFileStream;
  54. FN : String;
  55. begin
  56. FN:=ARequest.Url;
  57. If (length(FN)>0) and (FN[1]='/') then
  58. Delete(FN,1,1);
  59. DoDirSeparators(FN);
  60. FN:=BaseDir+FN;
  61. if FileExists(FN) then
  62. begin
  63. F:=TFileStream.Create(FN,fmOpenRead);
  64. try
  65. CheckMimeLoaded;
  66. AResponse.ContentType:=MimeTypes.GetMimeType(ExtractFileExt(FN));
  67. Writeln('Serving file: "',Fn,'". Reported Mime type: ',AResponse.ContentType);
  68. AResponse.ContentLength:=F.Size;
  69. AResponse.ContentStream:=F;
  70. AResponse.SendContent;
  71. AResponse.ContentStream:=Nil;
  72. finally
  73. F.Free;
  74. end;
  75. end
  76. else
  77. begin
  78. AResponse.Code:=404;
  79. AResponse.SendContent;
  80. end;
  81. Inc(FCount);
  82. If FCount>=5 then
  83. Active:=False;
  84. end;
  85. begin
  86. Serv:=TTestHTTPServer.Create(Nil);
  87. try
  88. Serv.BaseDir:=ExtractFilePath(ParamStr(0));
  89. {$ifdef unix}
  90. Serv.MimeTypesFile:='/etc/mime.types';
  91. {$endif}
  92. Serv.Threaded:=False;
  93. Serv.Port:=8080;
  94. Serv.AcceptIdleTimeout:=1000;
  95. Serv.OnAcceptIdle:[email protected];
  96. Serv.Active:=True;
  97. finally
  98. Serv.Free;
  99. end;
  100. end.