PDA

Показать полную графическую версию : ошибка при скачивании файла с сайта!!!


SGKorotkow
12-05-2008, 17:16
Добрый день!
Господа программисты помогите решить проблему!

а проблема в следующем: нужно периодически скачивать файлик с определённого сайта, через прокси. (и прокси и конечный сайт требуют аутентентификации!)
использую компоненты Indy BCBuilder 6. в инете куча инфы для Delphi, но мне нужно именно на с++.

TFileStream *file_str = new TFileStream("имя файла", fmCreate);
IdHTTP1->Request->ProxyServer = "";
IdHTTP1->Request->ProxyPort =3128;
IdHTTP1->Request->ProxyPassword = "";
IdHTTP1->Request->ProxyUsername = "";
IdHTTP1->Request->Username ="";
IdHTTP1->Request->Password = "";
IdHTTP1->Get("путь к файлу...", file_str);
delete file_str;

при выполнении строки IdHTTP1->Get("путь к файлу...", file_str); выдаётся ошибка:
Project Project1.exe raised exception class EIdProtocolReplyError with message '403 Forbidden' ...

на сколько я понял аутентификация через прокси проходит, но вот конечный сервер ругается!
может быть я не там задаю логин и пароль для конечного сервака?

заранее благодарен!

SGKorotkow
16-05-2008, 16:09
решил отказаться от компонентов и воспользоваться апишными функциями! но и здесь возникли проблемы!!! а именно:


dwStatusSize:=Sizeof(dwStatus);
OpenHandle:=InternetOpen(PChar('Project1.exe'),INTERNET_OPEN_TYPE_PROXY, PChar(Proxy), nil, 1);
// функция выполняется и возвращается значение $CC0004, значение мне не известно??? GetLastError возвращает код - 0.

ConnectHandle:=InternetConnect(OpenHandle, PAnsiChar(Server), INTERNET_DEFAULT_HTTPS_PORT, PChar(LoginServ), PChar(PassSer), INTERNET_SERVICE_HTTP, 0,0);
//функция выполняется и возвращается значение $CC0008, значение мне не известно??? GetLastError возвращает код - 0.

ResourceHandle:=HTTPOpenRequest(ConnectHandle, 'GET',PAnsiChar(RemoteFile), 'HTTP/1.0', nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
// результат $CC000С, GetLastError возвращает код - 122!!! толком описания этого кода я не нашёл!

InternetSetOption(ResourceHandle, INTERNET_OPTION_PROXY_USERNAME, PAnsiChar(Login), Length(Login)+1);
InternetSetOption(ResourceHandle, INTERNET_OPTION_PROXY_PASSWORD, PAnsiChar(Password), Length(Password)+1);

HttpSendRequest(ResourceHandle, nil, 0, nil, 0);
//результат функции True!
//в логах прокси сервера запроса нет!!! то есть непонятно, почему функции срабатывают и возвращают положительные ответы о выполнении, а прокси сервер ни одного обращения к удалённому серверу не фиксирует????

cnil:=0;
HttpQueryInfo(ResourceHandle, HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE, @dwStatus, dwStatusSize, cnil);
// результат функции True!
if (dwStatus = HTTP_STATUS_NOT_FOUND) then
begin
InternetCloseHandle(ResourceHandle);
InternetCloseHandle(ConnectHandle);
InternetCloseHandle(OpenHandle);
raise Exception.Create('Файл не найден '+RemoteFile);
end;
if (dwStatus = HTTP_STATUS_PROXY_AUTH_REQ) then
begin
InternetCloseHandle(ResourceHandle);
InternetCloseHandle(ConnectHandle);
InternetCloseHandle(OpenHandle);
raise Exception.Create('Неверный пользователь Proxy');
end;

AssignFile(F,LocalFile);
ReWrite(F);
r:=0;
InTag:=false;
repeat
InternetReadFile(ResourceHandle, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(F, Buffer, BufferLen);
//буфер содержит какие-то данные, но очень небольшого объёма, хотя скачиваемый файл около 3-х метров?
until BufferLen = 0;
CloseFile(F);

в чём ошибка???




© OSzone.net 2001-2012