httpget.pas 3.6 KB

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