testhttpserver.pas 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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, URIParser;
  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. URI: TURI;
  54. TimeOut: Longint;
  55. begin
  56. URI:=ParseURI(ARequest.Url, False);
  57. FN:=URI.Path+URI.Document;
  58. if TryStrToInt(URI.Params, TimeOut) then
  59. Sleep(TimeOut);
  60. If (length(FN)>0) and (FN[1]='/') then
  61. Delete(FN,1,1);
  62. DoDirSeparators(FN);
  63. FN:=BaseDir+FN;
  64. if FileExists(FN) then
  65. begin
  66. F:=TFileStream.Create(FN,fmOpenRead or fmShareDenyNone);
  67. try
  68. CheckMimeLoaded;
  69. AResponse.ContentType:=MimeTypes.GetMimeType(ExtractFileExt(FN));
  70. WriteInfo('Connection ('+aRequest.Connection.ConnectionID+') - Request ['+aRequest.RequestID+']: Serving file: "'+Fn+'". Reported Mime type: '+AResponse.ContentType);
  71. AResponse.ContentLength:=F.Size;
  72. AResponse.ContentStream:=F;
  73. AResponse.SendContent;
  74. AResponse.ContentStream:=Nil;
  75. finally
  76. F.Free;
  77. end;
  78. end
  79. else
  80. begin
  81. AResponse.Code:=404;
  82. AResponse.ContentLength:=0;
  83. AResponse.SendContent;
  84. end;
  85. Inc(FCount);
  86. end;
  87. end.