2
0

httpget.pas 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. program httpget;
  2. {$mode objfpc}{$H+}
  3. {$DEFINE USEGNUTLS}
  4. uses
  5. SysUtils, Classes, fphttpclient,
  6. {$IFNDEF USEGNUTLS}
  7. fpopenssl, opensslsockets,
  8. {$else}
  9. gnutls, gnutlssockets,
  10. {$endif}
  11. sslsockets;
  12. Type
  13. { TTestApp }
  14. TTestApp = Class(Tobject)
  15. procedure DoProgress(Sender: TObject; Const ContentLength, CurrentPos : Int64);
  16. procedure DoHeaders(Sender : TObject);
  17. procedure DoPassword(Sender: TObject; var RepeatRequest: Boolean);
  18. procedure ShowRedirect(ASender : TObject; Const ASrc : String; Var ADest : String);
  19. Procedure Run;
  20. end;
  21. procedure TTestApp.DoHeaders(Sender : TObject);
  22. Var
  23. I : Integer;
  24. begin
  25. Writeln('Response headers received:');
  26. With (Sender as TFPHTTPClient) do
  27. For I:=0 to ResponseHeaders.Count-1 do
  28. Writeln(ResponseHeaders[i]);
  29. end;
  30. procedure TTestApp.DoProgress(Sender: TObject; const ContentLength, CurrentPos: Int64);
  31. begin
  32. If (ContentLength=0) then
  33. Writeln('Reading headers : ',CurrentPos,' Bytes.')
  34. else If (ContentLength=-1) then
  35. Writeln('Reading data (no length available) : ',CurrentPos,' Bytes.')
  36. else
  37. Writeln('Reading data : ',CurrentPos,' Bytes of ',ContentLength);
  38. end;
  39. procedure TTestApp.DoPassword(Sender: TObject; var RepeatRequest: Boolean);
  40. Var
  41. H,UN,PW : String;
  42. P : Integer;
  43. begin
  44. With TFPHTTPClient(Sender) do
  45. begin
  46. H:=GetHeader(ResponseHeaders,'WWW-Authenticate');
  47. end;
  48. P:=Pos('realm',LowerCase(H));
  49. if (P>0) then
  50. begin
  51. P:=Pos('"',H);
  52. Delete(H,1,P);
  53. P:=Pos('"',H);
  54. H:=Copy(H,1,Pos('"',H)-1);
  55. end;
  56. Writeln('Authorization required. Remote site says: ',H);
  57. Write('Enter username (empty quits): ');
  58. ReadLn(UN);
  59. RepeatRequest:=(UN<>'');
  60. if RepeatRequest then
  61. begin
  62. Write('Enter password: ');
  63. Readln(PW);
  64. TFPHTTPClient(Sender).UserName:=UN;
  65. TFPHTTPClient(Sender).Password:=PW;
  66. end;
  67. end;
  68. procedure TTestApp.ShowRedirect(ASender: TObject; const ASrc: String;
  69. var ADest: String);
  70. begin
  71. Writeln('Following redirect from ',ASrc,' ==> ',ADest);
  72. end;
  73. procedure TTestApp.Run;
  74. begin
  75. if (ParamCount<>2) then
  76. begin
  77. writeln('Usage : ',ExtractFileName(ParamStr(0)), ' URL filename');
  78. Halt(1);
  79. end;
  80. With TFPHTTPClient.Create(Nil) do
  81. try
  82. AllowRedirect:=True;
  83. OnRedirect:=@ShowRedirect;
  84. OnPassword:=@DoPassword;
  85. OnDataReceived:=@DoProgress;
  86. OnHeaders:=@DoHeaders;
  87. { Set this if you want to try a proxy.
  88. Proxy.Host:='195.207.46.20';
  89. Proxy.Port:=8080;
  90. }
  91. Get(ParamStr(1),ParamStr(2));
  92. finally
  93. Free;
  94. end;
  95. end;
  96. begin
  97. With TTestApp.Create do
  98. try
  99. Run;
  100. finally
  101. Free;
  102. end;
  103. end.