simplehttpserver.pas 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. program simplehttpserver;
  2. {$mode objfpc}{$H+}
  3. {$define UseCThreads}
  4. {$linklib pthread}
  5. uses
  6. {$IFDEF UNIX}{$IFDEF UseCThreads}
  7. cthreads,
  8. {$ENDIF}{$ENDIF}
  9. sysutils, Classes, fphttpserver, fpmimetypes;
  10. Type
  11. { TTestHTTPServer }
  12. TTestHTTPServer = Class(TFPHTTPServer)
  13. private
  14. FBaseDir : String;
  15. FCount : Integer;
  16. FMimeLoaded : Boolean;
  17. FMimeTypesFile: String;
  18. procedure SetBaseDir(const AValue: String);
  19. Protected
  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.CheckMimeLoaded;
  39. begin
  40. If (Not MimeLoaded) and (MimeTypesFile<>'') then
  41. begin
  42. MimeTypes.LoadFromFile(MimeTypesFile);
  43. FMimeLoaded:=true;
  44. end;
  45. end;
  46. procedure TTestHTTPServer.HandleRequest(var ARequest: TFPHTTPConnectionRequest;
  47. var AResponse: TFPHTTPConnectionResponse);
  48. Var
  49. F : TFileStream;
  50. FN : String;
  51. begin
  52. FN:=ARequest.Url;
  53. If (length(FN)>0) and (FN[1]='/') then
  54. Delete(FN,1,1);
  55. DoDirSeparators(FN);
  56. FN:=BaseDir+FN;
  57. if FileExists(FN) then
  58. begin
  59. F:=TFileStream.Create(FN,fmOpenRead);
  60. try
  61. CheckMimeLoaded;
  62. AResponse.ContentType:=MimeTypes.GetMimeType(ExtractFileExt(FN));
  63. Writeln('Serving file: "',Fn,'". Reported Mime type: ',AResponse.ContentType);
  64. AResponse.ContentLength:=F.Size;
  65. AResponse.ContentStream:=F;
  66. AResponse.SendContent;
  67. AResponse.ContentStream:=Nil;
  68. finally
  69. F.Free;
  70. end;
  71. end
  72. else
  73. begin
  74. AResponse.Code:=404;
  75. AResponse.SendContent;
  76. end;
  77. Inc(FCount);
  78. If FCount>=5 then
  79. Active:=False;
  80. end;
  81. begin
  82. Serv:=TTestHTTPServer.Create(Nil);
  83. try
  84. Serv.BaseDir:=ExtractFilePath(ParamStr(0));
  85. {$ifdef unix}
  86. Serv.MimeTypesFile:='/etc/mime.types';
  87. {$endif}
  88. Serv.Threaded:=False;
  89. Serv.Port:=8080;
  90. Serv.Active:=True;
  91. finally
  92. Serv.Free;
  93. end;
  94. end.