testhttpserver.pas 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. unit testhttpserver;
  2. {$mode objfpc}{$H+}
  3. {$define UseCThreads}
  4. interface
  5. uses
  6. {$IFDEF UNIX}{$IFDEF UseCThreads}
  7. cthreads,
  8. {$ENDIF}{$ENDIF}
  9. sysutils, Classes, fphttpserver, fpmimetypes;
  10. Type
  11. TWriteInfoMethod = procedure(S: string) of object;
  12. { TTestHTTPServer }
  13. TTestHTTPServer = Class(TFPHTTPServer)
  14. private
  15. FBaseDir : String;
  16. FCount : Integer;
  17. FMimeLoaded : Boolean;
  18. FMimeTypesFile: String;
  19. FWriteInfo: TWriteInfoMethod;
  20. procedure SetBaseDir(const AValue: String);
  21. Protected
  22. procedure CheckMimeLoaded;
  23. Property MimeLoaded : Boolean Read FMimeLoaded;
  24. public
  25. procedure HandleRequest(Var ARequest: TFPHTTPConnectionRequest;
  26. Var AResponse : TFPHTTPConnectionResponse); override;
  27. Property BaseDir : String Read FBaseDir Write SetBaseDir;
  28. Property MimeTypesFile : String Read FMimeTypesFile Write FMimeTypesFile;
  29. Property WriteInfo: TWriteInfoMethod Read FWriteInfo Write FWriteInfo;
  30. end;
  31. implementation
  32. { TTestHTTPServer }
  33. procedure TTestHTTPServer.SetBaseDir(const AValue: String);
  34. begin
  35. if FBaseDir=AValue then exit;
  36. FBaseDir:=AValue;
  37. If (FBaseDir<>'') then
  38. FBaseDir:=IncludeTrailingPathDelimiter(FBaseDir);
  39. end;
  40. procedure TTestHTTPServer.CheckMimeLoaded;
  41. begin
  42. If (Not MimeLoaded) and (MimeTypesFile<>'') then
  43. begin
  44. MimeTypes.LoadFromFile(MimeTypesFile);
  45. FMimeLoaded:=true;
  46. end;
  47. end;
  48. procedure TTestHTTPServer.HandleRequest(var ARequest: TFPHTTPConnectionRequest;
  49. var AResponse: TFPHTTPConnectionResponse);
  50. Var
  51. F : TFileStream;
  52. FN : String;
  53. begin
  54. FN:=ARequest.Url;
  55. If (length(FN)>0) and (FN[1]='/') then
  56. Delete(FN,1,1);
  57. DoDirSeparators(FN);
  58. FN:=BaseDir+FN;
  59. if FileExists(FN) then
  60. begin
  61. F:=TFileStream.Create(FN,fmOpenRead or fmShareDenyNone);
  62. try
  63. CheckMimeLoaded;
  64. AResponse.ContentType:=MimeTypes.GetMimeType(ExtractFileExt(FN));
  65. WriteInfo('Serving file: "'+Fn+'". Reported Mime type: '+AResponse.ContentType);
  66. AResponse.ContentLength:=F.Size;
  67. AResponse.ContentStream:=F;
  68. AResponse.SendContent;
  69. AResponse.ContentStream:=Nil;
  70. finally
  71. F.Free;
  72. end;
  73. end
  74. else
  75. begin
  76. AResponse.Code:=404;
  77. AResponse.SendContent;
  78. end;
  79. Inc(FCount);
  80. end;
  81. end.