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情况.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值