TProxySetting
unit
uProxySetting;
interface
uses
Classes, SysUtils;
type
TProxySetting = class
private
FIsApplyProxySettingsToIE: Boolean;
FIsEnableProxy: Boolean;
FProxyType: Byte;
FProxyHost: String;
FProxyDomain: String;
FProxyPassword: String;
FProxyPort: Word;
FProxyUser: String;
procedure SetIsEnableProxy( const Value: Boolean);
procedure SetIsApplyProxySettingsToIE( const Value: Boolean);
procedure SetProxyDomain( const Value: String);
procedure SetProxyHost( const Value: String);
procedure SetProxyPassword( const Value: String);
procedure SetProxyPort( const Value: Word);
procedure SetProxyType( const Value: Byte);
function getProxyUserName: String;
function GetProxyPassword : String;
procedure SetProxyUser( const Value: String);
public
function ToXML : String;
procedure Init ( ANode : string ) ;
function Clone : TProxySetting;
published
// 是否使用代理,对应于 < proxySettings > 节点中的"proxyEnable"属性。
property IsEnableProxy : Boolean read FIsEnableProxy write SetIsEnableProxy;
// 是否将此代理设置使用到IE中,对应于 < proxySettings > 节点中的"applyToIE"属性。
property IsApplyProxySettingsToIE : Boolean read FIsApplyProxySettingsToIE write SetIsApplyProxySettingsToIE;
// 代理类型,对应于 < proxySettings > 节点中的"proxyType"属性。
// 代理服务器类型; 0 :HTTP; 1 :SOCKS4;
property ProxyType : Byte read FProxyType write SetProxyType;
// 代理服务器地址,对应于 < proxySettings > 节点中的"proxyHost"属性。
property ProxyHost : String read FProxyHost write SetProxyHost;
// 代理服务器端口,对应于 < proxySettings > 节点中的"proxyPort"属性。
property ProxyPort : Word read FProxyPort write SetProxyPort;
// 代理服务器域,对应于 < proxySettings > 节点中的"domainName"属性。
property ProxyDomain : String read FProxyDomain write SetProxyDomain;
// 代理服务器域用户ID,对应于 < proxySettings > 节点中的"proxyUserName"属性。
property ProxyUser : String read FProxyUser write SetProxyUser;
// 代理服务器域用户密码,对应于 < proxySettings > 节点中的"proxyPasswordEncrypt"属性。
// 为了支持老版的文件,当proxyPasswordEncrypt为空时,将去找 "proxyPassword",
// 将老的值加密保存
property ProxyPassword : String read GetProxyPassword write SetProxyPassword;
// 代理服务器完整的用户名 ProxyDomain\ProxyUser
property ProxyUserName : String read getProxyUserName;
end ;
implementation
{ TProxySetting }
procedure TProxySetting.Init(ANode: string );
begin
{ TODO : xml to setting }
end ;
function TProxySetting.getProxyUserName: String;
begin
if SameText(trim(FProxyDomain), '' ) then
Result : = FProxyUser
else
Result : = FProxyDomain + ' \ ' + FProxyUser;
end ;
procedure TProxySetting.SetIsEnableProxy( const Value: Boolean);
begin
FIsEnableProxy : = Value;
end ;
procedure TProxySetting.SetIsApplyProxySettingsToIE( const Value: Boolean);
begin
FIsApplyProxySettingsToIE : = Value;
end ;
procedure TProxySetting.SetProxyDomain( const Value: String);
begin
FProxyDomain : = Value;
end ;
procedure TProxySetting.SetProxyHost( const Value: String);
begin
FProxyHost : = Value;
end ;
procedure TProxySetting.SetProxyPassword( const Value: String);
begin
FProxyPassword : = Value; // 加密
end ;
procedure TProxySetting.SetProxyPort( const Value: Word);
begin
FProxyPort : = Value;
end ;
procedure TProxySetting.SetProxyType( const Value: Byte);
begin
FProxyType : = Value;
end ;
procedure TProxySetting.SetProxyUser( const Value: String);
begin
FProxyUser : = Value;
end ;
function TProxySetting.ToXML: String;
var
LContents : TStringList;
begin
LContents : = TStringList.Create;
try
LContents.Append( ' <proxySettings ' );
LContents.Append( ' proxyEnable=" ' + BoolToStr(FIsEnableProxy, True) + ' " ' );
LContents.Append( ' applyToIE=" ' + BoolToStr(FIsApplyProxySettingsToIE, True) + ' " ' );
LContents.Append( ' proxyType=" ' + IntToStr(FProxyType) + ' " ' );
LContents.Append( ' proxyHost=" ' + FProxyHost + ' " ' );
LContents.Append( ' proxyPort=" ' + IntToStr(FProxyPort) + ' " ' );
LContents.Append( ' domainName=" ' + FProxyDomain + ' " ' );
LContents.Append( ' proxyUserName=" ' + FProxyUser + ' " ' );
LContents.Append( ' proxyPasswordEncrypt=" ' + FProxyPassword + ' " ' );
LContents.Append( ' /> ' );
Result : = LContents.Text;
finally
LContents.Free;
end ;
end ;
function TProxySetting.GetProxyPassword: String;
begin
Result : = FProxyPassword; // Decrypt
end ;
function TProxySetting.Clone: TProxySetting;
begin
Result : = TProxySetting.Create;
Result.FIsApplyProxySettingsToIE : = FIsApplyProxySettingsToIE;
Result.FIsEnableProxy : = FIsEnableProxy;
Result.FProxyType : = FProxyType;
Result.FProxyHost : = FProxyHost;
Result.FProxyDomain : = FProxyDomain;
Result.FProxyPassword : = FProxyPassword;
Result.FProxyPort : = FProxyPort;
Result.FProxyUser : = FProxyUser;
end ;
end .
interface
uses
Classes, SysUtils;
type
TProxySetting = class
private
FIsApplyProxySettingsToIE: Boolean;
FIsEnableProxy: Boolean;
FProxyType: Byte;
FProxyHost: String;
FProxyDomain: String;
FProxyPassword: String;
FProxyPort: Word;
FProxyUser: String;
procedure SetIsEnableProxy( const Value: Boolean);
procedure SetIsApplyProxySettingsToIE( const Value: Boolean);
procedure SetProxyDomain( const Value: String);
procedure SetProxyHost( const Value: String);
procedure SetProxyPassword( const Value: String);
procedure SetProxyPort( const Value: Word);
procedure SetProxyType( const Value: Byte);
function getProxyUserName: String;
function GetProxyPassword : String;
procedure SetProxyUser( const Value: String);
public
function ToXML : String;
procedure Init ( ANode : string ) ;
function Clone : TProxySetting;
published
// 是否使用代理,对应于 < proxySettings > 节点中的"proxyEnable"属性。
property IsEnableProxy : Boolean read FIsEnableProxy write SetIsEnableProxy;
// 是否将此代理设置使用到IE中,对应于 < proxySettings > 节点中的"applyToIE"属性。
property IsApplyProxySettingsToIE : Boolean read FIsApplyProxySettingsToIE write SetIsApplyProxySettingsToIE;
// 代理类型,对应于 < proxySettings > 节点中的"proxyType"属性。
// 代理服务器类型; 0 :HTTP; 1 :SOCKS4;
property ProxyType : Byte read FProxyType write SetProxyType;
// 代理服务器地址,对应于 < proxySettings > 节点中的"proxyHost"属性。
property ProxyHost : String read FProxyHost write SetProxyHost;
// 代理服务器端口,对应于 < proxySettings > 节点中的"proxyPort"属性。
property ProxyPort : Word read FProxyPort write SetProxyPort;
// 代理服务器域,对应于 < proxySettings > 节点中的"domainName"属性。
property ProxyDomain : String read FProxyDomain write SetProxyDomain;
// 代理服务器域用户ID,对应于 < proxySettings > 节点中的"proxyUserName"属性。
property ProxyUser : String read FProxyUser write SetProxyUser;
// 代理服务器域用户密码,对应于 < proxySettings > 节点中的"proxyPasswordEncrypt"属性。
// 为了支持老版的文件,当proxyPasswordEncrypt为空时,将去找 "proxyPassword",
// 将老的值加密保存
property ProxyPassword : String read GetProxyPassword write SetProxyPassword;
// 代理服务器完整的用户名 ProxyDomain\ProxyUser
property ProxyUserName : String read getProxyUserName;
end ;
implementation
{ TProxySetting }
procedure TProxySetting.Init(ANode: string );
begin
{ TODO : xml to setting }
end ;
function TProxySetting.getProxyUserName: String;
begin
if SameText(trim(FProxyDomain), '' ) then
Result : = FProxyUser
else
Result : = FProxyDomain + ' \ ' + FProxyUser;
end ;
procedure TProxySetting.SetIsEnableProxy( const Value: Boolean);
begin
FIsEnableProxy : = Value;
end ;
procedure TProxySetting.SetIsApplyProxySettingsToIE( const Value: Boolean);
begin
FIsApplyProxySettingsToIE : = Value;
end ;
procedure TProxySetting.SetProxyDomain( const Value: String);
begin
FProxyDomain : = Value;
end ;
procedure TProxySetting.SetProxyHost( const Value: String);
begin
FProxyHost : = Value;
end ;
procedure TProxySetting.SetProxyPassword( const Value: String);
begin
FProxyPassword : = Value; // 加密
end ;
procedure TProxySetting.SetProxyPort( const Value: Word);
begin
FProxyPort : = Value;
end ;
procedure TProxySetting.SetProxyType( const Value: Byte);
begin
FProxyType : = Value;
end ;
procedure TProxySetting.SetProxyUser( const Value: String);
begin
FProxyUser : = Value;
end ;
function TProxySetting.ToXML: String;
var
LContents : TStringList;
begin
LContents : = TStringList.Create;
try
LContents.Append( ' <proxySettings ' );
LContents.Append( ' proxyEnable=" ' + BoolToStr(FIsEnableProxy, True) + ' " ' );
LContents.Append( ' applyToIE=" ' + BoolToStr(FIsApplyProxySettingsToIE, True) + ' " ' );
LContents.Append( ' proxyType=" ' + IntToStr(FProxyType) + ' " ' );
LContents.Append( ' proxyHost=" ' + FProxyHost + ' " ' );
LContents.Append( ' proxyPort=" ' + IntToStr(FProxyPort) + ' " ' );
LContents.Append( ' domainName=" ' + FProxyDomain + ' " ' );
LContents.Append( ' proxyUserName=" ' + FProxyUser + ' " ' );
LContents.Append( ' proxyPasswordEncrypt=" ' + FProxyPassword + ' " ' );
LContents.Append( ' /> ' );
Result : = LContents.Text;
finally
LContents.Free;
end ;
end ;
function TProxySetting.GetProxyPassword: String;
begin
Result : = FProxyPassword; // Decrypt
end ;
function TProxySetting.Clone: TProxySetting;
begin
Result : = TProxySetting.Create;
Result.FIsApplyProxySettingsToIE : = FIsApplyProxySettingsToIE;
Result.FIsEnableProxy : = FIsEnableProxy;
Result.FProxyType : = FProxyType;
Result.FProxyHost : = FProxyHost;
Result.FProxyDomain : = FProxyDomain;
Result.FProxyPassword : = FProxyPassword;
Result.FProxyPort : = FProxyPort;
Result.FProxyUser : = FProxyUser;
end ;
end .
uHttpLoader
unit
uHttpLoader;
interface
uses
IdHTTP, IdComponent,IdAuthentication,IdHeaderList,IdSocks, IdIOHandlerSocket,
IdAuthenticationDigest,IdAuthenticationSSPI,
// IdException,DateUtils, Forms,
uProxySetting,
Classes,SysUtils;
type
THttpLoader = class
private
FHttp: TIdhttp;
FStop: Boolean;
FOnWorkBegin: TWorkBeginEvent;
FOnWorkEnd: TWorkEndEvent;
FOnWork: TWorkEvent;
FProxySetting: TProxySetting;
procedure SetStop( const Value: Boolean);
procedure DoWorkBeginEvent(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure DoWorkEndEvent(Sender: TObject; AWorkMode: TWorkMode);
procedure DoWorkEvent(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
procedure IdHTTPSelectProxyAuthorization(Sender: TObject;
var AuthenticationClass: TIdAuthenticationClass;
AuthInfo: TIdHeaderList);
procedure IdHTTPProxyAuthorization(Sender: TObject;
Authentication: TIdAuthentication; var Handled: Boolean);
procedure SetProxySetting( const Value: TProxySetting);
public
constructor Create;
destructor Destroy; override ;
procedure Init;
function Get(AUrl : String; AHeaders : TStringList) : TMemoryStream; overload ;
function Get(AUrl : String) : TMemoryStream; overload ;
procedure Post(AURL: String; AHeaders : TStringList;
const ASource, AResponseContent: TStream; out AErrMessage : String); overload ;
procedure Post(AURL: String; const ASource, AResponseContent: TStream;
out AErrMessage : String); overload ;
published
// 代理设置
property ProxySetting : TProxySetting read FProxySetting write SetProxySetting;
// 是否停止下载
property Stop : Boolean read FStop write SetStop;
property OnWork: TWorkEvent read FOnWork write FOnWork;
property OnWorkBegin: TWorkBeginEvent read FOnWorkBegin write FOnWorkBegin;
property OnWorkEnd: TWorkEndEvent read FOnWorkEnd write FOnWorkEnd;
end ;
implementation
{ THttpLoader }
constructor THttpLoader.Create;
begin
FHttp : = TIdHTTP.Create( nil );
FHttp.HandleRedirects : = True;
FHttp.RedirectMaximum : = 5 ;
FHttp.HTTPOptions : = FHttp.HTTPOptions + [hoInProcessAuth];
FHttp.OnProxyAuthorization : = IdHTTPProxyAuthorization;
FHttp.OnSelectProxyAuthorization : = IdHTTPSelectProxyAuthorization;
end ;
destructor THttpLoader.Destroy;
begin
FHttp.Free;
inherited ;
end ;
procedure THttpLoader.DoWorkBeginEvent(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
end ;
procedure THttpLoader.DoWorkEndEvent(Sender: TObject;
AWorkMode: TWorkMode);
begin
end ;
procedure THttpLoader.DoWorkEvent(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
end ;
function THttpLoader.Get(AUrl: String): TMemoryStream;
const QUREYCHAR = ' ? ' ;
const QUREYPARAMCHAR = ' ? ' ;
function CreateRandomStr(ADestStr : string ) : string ;
var
LGuid: TGUID;
begin
CreateGUID(LGuid);
if Pos(QUREYCHAR, ADestStr) = 0 then
begin
Result : = ADestStr + QUREYCHAR + GUIDToString(LGuid);
end
else
begin
Result : = ADestStr + QUREYPARAMCHAR + GUIDToString(LGuid);
end ;
end ;
var
I : Integer;
begin
Result : = TMemoryStream.Create;
try
I : = 0 ;
repeat
if FStop then
Exit;
FHttp.Get(CreateRandomStr(AUrl), Result);
// Application.ProcessMessages;
Inc(I);
if (I > 3 ) then
break ;
until FHttp.ResponseCode = 200 ;
except
on E: Exception do
Result : = nil ;
end ;
end ;
function THttpLoader.Get(AUrl: String;
AHeaders: TStringList): TMemoryStream;
var
I : Integer;
begin
FHttp.Request.CustomHeaders.Clear;
for I : = 0 to AHeaders.Count - 1 do
begin
FHttp.Request.CustomHeaders.Append(AHeaders.Strings[I]);
end ;
Result : = Get(AUrl);
end ;
procedure THttpLoader.IdHTTPProxyAuthorization(Sender: TObject;
Authentication: TIdAuthentication; var Handled: Boolean);
begin
end ;
procedure THttpLoader.IdHTTPSelectProxyAuthorization(Sender: TObject;
var AuthenticationClass: TIdAuthenticationClass;
AuthInfo: TIdHeaderList);
var
LHttp: TIdHTTP;
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
LHttp : = Sender as TIdHTTP;
if Pos(LowerCase( ' Proxy-Authenticate: NTLM ' ), LowerCase(LHttp.Response.RawHeaders.Text)) > 0 then
begin
// LHttp.ProxyParams.Clear;
// LHttp.ProxyParams.BasicAuthentication : = false;
// Set the authentication class to NTLM
AuthenticationClass : = TIdSSPINTLMAuthentication;
end
else
begin
// Next check for Basic
if Pos(LowerCase( ' Proxy-Authenticate: Basic ' ), LowerCase(LHttp.Response.RawHeaders.Text)) > 0 then
begin
AuthenticationClass : = TIdBasicAuthentication;
LHttp.ProxyParams.BasicAuthentication : = true;
end
else
begin
// Then Digest
if Pos(LowerCase( ' Proxy-Authenticate: Digest ' ), LowerCase(LHttp.Response.RawHeaders.Text)) > 0 then
AuthenticationClass : = TIdDigestAuthentication
end ;
end ;
end ;
procedure THttpLoader.Init;
var
LSocksInfo: TIdSocksInfo;
LHandlerSocket: TIdIOHandlerSocket;
begin
FStop : = False;
with FProxySetting do
begin
if IsEnableProxy then
begin
case ProxyType of
0 :
begin
FHttp.IOHandler : = nil ;
FHttp.ProxyParams.ProxyServer : = ProxyHost;
FHttp.ProxyParams.ProxyPort : = ProxyPort;
FHttp.ProxyParams.ProxyUsername : = ProxyUserName;
FHttp.ProxyParams.ProxyPassword : = ProxyPassword;
end ;
else
begin
FHttp.IOHandler : = nil ;
LSocksInfo : = TIdSocksInfo.Create( nil );
LSocksInfo.Version : = svSocks4;
LSocksInfo.Host : = ProxyHost;
LSocksInfo.Port : = ProxyPort;
LHandlerSocket : = TIdIOHandlerSocket.Create( nil );
LHandlerSocket.SocksInfo : = LSocksInfo;
FHttp.IOHandler : = LHandlerSocket;
end ;
end ;
end
else
begin
FHttp.ProxyParams.ProxyServer : = '' ;
FHttp.ProxyParams.ProxyUsername : = '' ;
FHttp.ProxyParams.ProxyPassword : = '' ;
FHttp.ProxyParams.ProxyPort : = 80 ;
FHttp.IOHandler : = nil ;
end ;
end ;
FHttp.OnWork : = OnWork;
FHttp.OnWorkBegin : = OnWorkBegin;
FHttp.OnWorkEnd : = OnWorkEnd;
end ;
procedure THttpLoader.Post(AURL: String; const ASource,
AResponseContent: TStream; out AErrMessage: String);
var
I : Integer;
begin
try
I : = 0 ;
repeat
if FStop then
Exit;
FHttp.Post(AUrl, ASource, AResponseContent);
// Application.ProcessMessages;
Inc(I);
if (I > 3 ) then
break ;
until FHttp.ResponseCode = 200 ;
except
on E: Exception do
AErrMessage : = E.Message;
end ;
end ;
procedure THttpLoader.Post(AURL: String; AHeaders: TStringList;
const ASource, AResponseContent: TStream; out AErrMessage: String);
var
I : Integer;
begin
FHttp.Request.CustomHeaders.Clear;
for I : = 0 to AHeaders.Count - 1 do
begin
FHttp.Request.CustomHeaders.Append(AHeaders.Strings[I]);
end ;
Post(AURL, ASource,AResponseContent, AErrMessage);
end ;
procedure THttpLoader.SetProxySetting( const Value: TProxySetting);
begin
FProxySetting : = Value;
end ;
procedure THttpLoader.SetStop( const Value: Boolean);
begin
FStop : = Value;
end ;
end .
interface
uses
IdHTTP, IdComponent,IdAuthentication,IdHeaderList,IdSocks, IdIOHandlerSocket,
IdAuthenticationDigest,IdAuthenticationSSPI,
// IdException,DateUtils, Forms,
uProxySetting,
Classes,SysUtils;
type
THttpLoader = class
private
FHttp: TIdhttp;
FStop: Boolean;
FOnWorkBegin: TWorkBeginEvent;
FOnWorkEnd: TWorkEndEvent;
FOnWork: TWorkEvent;
FProxySetting: TProxySetting;
procedure SetStop( const Value: Boolean);
procedure DoWorkBeginEvent(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure DoWorkEndEvent(Sender: TObject; AWorkMode: TWorkMode);
procedure DoWorkEvent(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
procedure IdHTTPSelectProxyAuthorization(Sender: TObject;
var AuthenticationClass: TIdAuthenticationClass;
AuthInfo: TIdHeaderList);
procedure IdHTTPProxyAuthorization(Sender: TObject;
Authentication: TIdAuthentication; var Handled: Boolean);
procedure SetProxySetting( const Value: TProxySetting);
public
constructor Create;
destructor Destroy; override ;
procedure Init;
function Get(AUrl : String; AHeaders : TStringList) : TMemoryStream; overload ;
function Get(AUrl : String) : TMemoryStream; overload ;
procedure Post(AURL: String; AHeaders : TStringList;
const ASource, AResponseContent: TStream; out AErrMessage : String); overload ;
procedure Post(AURL: String; const ASource, AResponseContent: TStream;
out AErrMessage : String); overload ;
published
// 代理设置
property ProxySetting : TProxySetting read FProxySetting write SetProxySetting;
// 是否停止下载
property Stop : Boolean read FStop write SetStop;
property OnWork: TWorkEvent read FOnWork write FOnWork;
property OnWorkBegin: TWorkBeginEvent read FOnWorkBegin write FOnWorkBegin;
property OnWorkEnd: TWorkEndEvent read FOnWorkEnd write FOnWorkEnd;
end ;
implementation
{ THttpLoader }
constructor THttpLoader.Create;
begin
FHttp : = TIdHTTP.Create( nil );
FHttp.HandleRedirects : = True;
FHttp.RedirectMaximum : = 5 ;
FHttp.HTTPOptions : = FHttp.HTTPOptions + [hoInProcessAuth];
FHttp.OnProxyAuthorization : = IdHTTPProxyAuthorization;
FHttp.OnSelectProxyAuthorization : = IdHTTPSelectProxyAuthorization;
end ;
destructor THttpLoader.Destroy;
begin
FHttp.Free;
inherited ;
end ;
procedure THttpLoader.DoWorkBeginEvent(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
end ;
procedure THttpLoader.DoWorkEndEvent(Sender: TObject;
AWorkMode: TWorkMode);
begin
end ;
procedure THttpLoader.DoWorkEvent(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
end ;
function THttpLoader.Get(AUrl: String): TMemoryStream;
const QUREYCHAR = ' ? ' ;
const QUREYPARAMCHAR = ' ? ' ;
function CreateRandomStr(ADestStr : string ) : string ;
var
LGuid: TGUID;
begin
CreateGUID(LGuid);
if Pos(QUREYCHAR, ADestStr) = 0 then
begin
Result : = ADestStr + QUREYCHAR + GUIDToString(LGuid);
end
else
begin
Result : = ADestStr + QUREYPARAMCHAR + GUIDToString(LGuid);
end ;
end ;
var
I : Integer;
begin
Result : = TMemoryStream.Create;
try
I : = 0 ;
repeat
if FStop then
Exit;
FHttp.Get(CreateRandomStr(AUrl), Result);
// Application.ProcessMessages;
Inc(I);
if (I > 3 ) then
break ;
until FHttp.ResponseCode = 200 ;
except
on E: Exception do
Result : = nil ;
end ;
end ;
function THttpLoader.Get(AUrl: String;
AHeaders: TStringList): TMemoryStream;
var
I : Integer;
begin
FHttp.Request.CustomHeaders.Clear;
for I : = 0 to AHeaders.Count - 1 do
begin
FHttp.Request.CustomHeaders.Append(AHeaders.Strings[I]);
end ;
Result : = Get(AUrl);
end ;
procedure THttpLoader.IdHTTPProxyAuthorization(Sender: TObject;
Authentication: TIdAuthentication; var Handled: Boolean);
begin
end ;
procedure THttpLoader.IdHTTPSelectProxyAuthorization(Sender: TObject;
var AuthenticationClass: TIdAuthenticationClass;
AuthInfo: TIdHeaderList);
var
LHttp: TIdHTTP;
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
LHttp : = Sender as TIdHTTP;
if Pos(LowerCase( ' Proxy-Authenticate: NTLM ' ), LowerCase(LHttp.Response.RawHeaders.Text)) > 0 then
begin
// LHttp.ProxyParams.Clear;
// LHttp.ProxyParams.BasicAuthentication : = false;
// Set the authentication class to NTLM
AuthenticationClass : = TIdSSPINTLMAuthentication;
end
else
begin
// Next check for Basic
if Pos(LowerCase( ' Proxy-Authenticate: Basic ' ), LowerCase(LHttp.Response.RawHeaders.Text)) > 0 then
begin
AuthenticationClass : = TIdBasicAuthentication;
LHttp.ProxyParams.BasicAuthentication : = true;
end
else
begin
// Then Digest
if Pos(LowerCase( ' Proxy-Authenticate: Digest ' ), LowerCase(LHttp.Response.RawHeaders.Text)) > 0 then
AuthenticationClass : = TIdDigestAuthentication
end ;
end ;
end ;
procedure THttpLoader.Init;
var
LSocksInfo: TIdSocksInfo;
LHandlerSocket: TIdIOHandlerSocket;
begin
FStop : = False;
with FProxySetting do
begin
if IsEnableProxy then
begin
case ProxyType of
0 :
begin
FHttp.IOHandler : = nil ;
FHttp.ProxyParams.ProxyServer : = ProxyHost;
FHttp.ProxyParams.ProxyPort : = ProxyPort;
FHttp.ProxyParams.ProxyUsername : = ProxyUserName;
FHttp.ProxyParams.ProxyPassword : = ProxyPassword;
end ;
else
begin
FHttp.IOHandler : = nil ;
LSocksInfo : = TIdSocksInfo.Create( nil );
LSocksInfo.Version : = svSocks4;
LSocksInfo.Host : = ProxyHost;
LSocksInfo.Port : = ProxyPort;
LHandlerSocket : = TIdIOHandlerSocket.Create( nil );
LHandlerSocket.SocksInfo : = LSocksInfo;
FHttp.IOHandler : = LHandlerSocket;
end ;
end ;
end
else
begin
FHttp.ProxyParams.ProxyServer : = '' ;
FHttp.ProxyParams.ProxyUsername : = '' ;
FHttp.ProxyParams.ProxyPassword : = '' ;
FHttp.ProxyParams.ProxyPort : = 80 ;
FHttp.IOHandler : = nil ;
end ;
end ;
FHttp.OnWork : = OnWork;
FHttp.OnWorkBegin : = OnWorkBegin;
FHttp.OnWorkEnd : = OnWorkEnd;
end ;
procedure THttpLoader.Post(AURL: String; const ASource,
AResponseContent: TStream; out AErrMessage: String);
var
I : Integer;
begin
try
I : = 0 ;
repeat
if FStop then
Exit;
FHttp.Post(AUrl, ASource, AResponseContent);
// Application.ProcessMessages;
Inc(I);
if (I > 3 ) then
break ;
until FHttp.ResponseCode = 200 ;
except
on E: Exception do
AErrMessage : = E.Message;
end ;
end ;
procedure THttpLoader.Post(AURL: String; AHeaders: TStringList;
const ASource, AResponseContent: TStream; out AErrMessage: String);
var
I : Integer;
begin
FHttp.Request.CustomHeaders.Clear;
for I : = 0 to AHeaders.Count - 1 do
begin
FHttp.Request.CustomHeaders.Append(AHeaders.Strings[I]);
end ;
Post(AURL, ASource,AResponseContent, AErrMessage);
end ;
procedure THttpLoader.SetProxySetting( const Value: TProxySetting);
begin
FProxySetting : = Value;
end ;
procedure THttpLoader.SetStop( const Value: Boolean);
begin
FStop : = Value;
end ;
end .