simplehttpserver.pas 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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;
  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 CheckMimeLoaded;
  20. Property MimeLoaded : Boolean Read FMimeLoaded;
  21. public
  22. procedure HandleRequest(Var ARequest: TFPHTTPConnectionRequest;
  23. Var AResponse : TFPHTTPConnectionResponse); override;
  24. Property BaseDir : String Read FBaseDir Write SetBaseDir;
  25. Property MimeTypesFile : String Read FMimeTypesFile Write FMimeTypesFile;
  26. end;
  27. Var
  28. Serv : TTestHTTPServer;
  29. { TTestHTTPServer }
  30. procedure TTestHTTPServer.SetBaseDir(const AValue: String);
  31. begin
  32. if FBaseDir=AValue then exit;
  33. FBaseDir:=AValue;
  34. If (FBaseDir<>'') then
  35. FBaseDir:=IncludeTrailingPathDelimiter(FBaseDir);
  36. end;
  37. procedure TTestHTTPServer.CheckMimeLoaded;
  38. begin
  39. If (Not MimeLoaded) and (MimeTypesFile<>'') then
  40. begin
  41. MimeTypes.LoadFromFile(MimeTypesFile);
  42. FMimeLoaded:=true;
  43. end;
  44. end;
  45. procedure TTestHTTPServer.HandleRequest(var ARequest: TFPHTTPConnectionRequest;
  46. var AResponse: TFPHTTPConnectionResponse);
  47. Var
  48. F : TFileStream;
  49. FN : String;
  50. begin
  51. FN:=ARequest.Url;
  52. If (length(FN)>0) and (FN[1]='/') then
  53. Delete(FN,1,1);
  54. DoDirSeparators(FN);
  55. FN:=BaseDir+FN;
  56. if FileExists(FN) then
  57. begin
  58. F:=TFileStream.Create(FN,fmOpenRead);
  59. try
  60. CheckMimeLoaded;
  61. AResponse.ContentType:=MimeTypes.GetMimeType(ExtractFileExt(FN));
  62. Writeln('Serving file: "',Fn,'". Reported Mime type: ',AResponse.ContentType);
  63. AResponse.ContentLength:=F.Size;
  64. AResponse.ContentStream:=F;
  65. AResponse.SendContent;
  66. AResponse.ContentStream:=Nil;
  67. finally
  68. F.Free;
  69. end;
  70. end
  71. else
  72. begin
  73. AResponse.Code:=404;
  74. AResponse.SendContent;
  75. end;
  76. Inc(FCount);
  77. If FCount>=5 then
  78. Active:=False;
  79. end;
  80. begin
  81. Serv:=TTestHTTPServer.Create(Nil);
  82. try
  83. Serv.BaseDir:=ExtractFilePath(ParamStr(0));
  84. {$ifdef unix}
  85. Serv.MimeTypesFile:='/etc/mime.types';
  86. {$endif}
  87. Serv.Threaded:=False;
  88. Serv.Port:=8080;
  89. Serv.Active:=True;
  90. finally
  91. Serv.Free;
  92. end;
  93. end.