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