在过去的 2 天里,我一直试图断断续续地解决这个问题,但我真的被困住了。希望一些聪明的人可以帮助我。
问题是我有一个函数,我在一个线程中调用该函数,该线程从传递给它的网站下载文件(使用 Synapse 库)。但是,我发现每隔一段时间就有一些网站不会下载文件,但 wget 或 Firefox/IE 会毫无问题地下载它。
深入研究,我发现了一些奇怪的东西。以下是相关代码:
uses
//[..]
HTTPSend,
blcksock;
//[..]
type
TMyThread = class(TThread)
protected
procedure Execute; override;
private
{ Private declarations }
fTheUrl: string;
procedure GetFile(const TheUrl: string);
public
property thrd_TheUrl: string read fTheUrl write fTheUrl;
end;
implementation
[..]
procedure TMyThread.GetFile(const TheUrl: string);
var
HTTP: THTTPSend;
success: boolean;
sLocalUrl: string;
IsSame : boolean;
begin
HTTP := THTTPSend.Create;
try
HTTP.UserAgent :=
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)';
HTTP.ProxyHost := 'MYPROXY.COM';
HTTP.ProxyPort := '80';
sLocalUrl :=
'http://web.archive.org/web/20071212205017/energizer.com/usbcharger/download/UsbCharger_setup_V1_1_1.exe';
IsSame := SameText(sLocalUrl, sTheUrl); //this equals True when I debug
///
///
/// THIS IS WHERE THE ISSUE BEGINS
/// I will comment out 1 of the following when debugging
///
HTTP.HTTPMethod('GET', sLocalUrl); // ----this works and WILL download the file
HTTP.HTTPMethod('GET', sTheUrl); // --- this always fails, and HTTP.ResultString contains "Not Found"
success := SysUtils.UpperCase(HTTP.ResultString) = 'OK';
if HTTP.ResultCode > 0 then
success := True; //this is here just to keep the value around while debugging
finally
HTTP.Free;
end;
end;
procedure TMyThread.Execute
begin
//fTheURL contains this value: http://web.archive.org/web/20071212205017/energizer.com/usbcharger/download/UsbCharger_setup_V1_1_1.exe
GetFile(fTheUrl);
end;
问题是当我为函数分配一个局部变量并直接给它 URL 时,一切正常。但是,当将变量传递给函数时,它会失败。有人有想法么?
HTTP.HTTPMethod('GET', sLocalUrl); // ----this works and WILL download the file
HTTP.HTTPMethod('GET', sTheUrl); // --- this always fails, and HTTP.ResultString contains "Not Found"
我正在使用他们的 SVN 存储库中的最新版本的 Synapse(2 天前的版本)。
注意:我正在尝试下载的文件已知有病毒,我正在编写的程序旨在下载恶意文件以进行分析。因此,下载后不要执行该文件。
但是,我正在使用这个 URL b/c 这是我可以重现该问题的一个。