httpget.pas 3.5 KB

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