indy 实现http proxy

关于http proxy原理见相关资料,这里讲述一下indy的实现

procedure TMyHttpProxyClient.InitProxy;
begin
  FHttp.ProxyParams.ProxyServer := address; //代理服务器地址
  FHttp.ProxyParams.ProxyPort := port; //代理服务器端口
  FHttp.ProxyParams.UserName := domain+user; //域名+用户名
  FHttp.ProxyParams.Password := pass;
  FHttp.Options := [hoInProcessAuth];
  FHttp.OnSelectProxyAuthentication := OnMySelectProxyAuthentication;
  FHttp.OnProxyAuthentication := OnMyProxyAuthentication;
end;

procedure TMyHttpProxyClient.OnMySelectProxyAuthentication(Sender: TObject; var AuthenticationClass: TIdAuthenticationClass; AuthInfo: TIdHeaderList);
begin
   // First check for NTLM authentication, as you do not need to
   // set username and password because Indy will automatically
   // handle passing your Windows Domain username and
   // password to the proxy server
   if (pos('Proxy-Authenticate: NTLM', FHttp.Response.RawHeaders.Text) > 0) then
   begin
     FHttp.ProxyParams.Clear;
     FHttp.ProxyParams.BasicAuthentication := false;
     // Set the authentication class to NTLM
     AuthenticationClass := TIdNTLMAuthentication;
   end
   else
   begin
     // Next check for Basic
     if (pos('Proxy-Authenticate: Basic',FHttp.Response.RawHeaders.Text) > 0) then
     begin
       AuthenticationClass := TIdBasicAuthentication;
       FHttp.ProxyParams.BasicAuthentication := true;
     end
     else
     begin
       // Then Digest
       if (pos('Proxy-Authenticate: Digest', FHttp.Response.RawHeaders.Text) > 0) then
         AuthenticationClass := TIdDigestAuthentication
     end;
       FHttp.ProxyParams.ProxyUsername := FProxyUsername;
       FHttp.ProxyParams.ProxyPassword := FProxyPassword;
   end;

end;

procedure TMyHttpProxyClient.OnProxyAuthentication(Sender: TObject; Authentication: TIdAuthentication; var Handled: boolean);
begin
  Handled := True;
end;

要注意的事,inntlm.pas存在bug,function SetupLanManagerPassword(APassword, nonce: String): String;和function CreateNTPassword(APassword, nonce: String): String;将lm_resp: array [1..24] of Char转化为string,没有考虑lm_resp中存在#0情况.

你可能感兴趣的:(indy 实现http proxy)