Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.36.141] |
|
Сообщ.
#1
,
|
|
|
Требуется закачать файл по фтп через Proxy. Требуется аутентификация Proxy.
|
Сообщ.
#2
,
|
|
|
Да не плохо было бы узнать как
|
Сообщ.
#3
,
|
|
|
Посмотри параметры этой функциии
function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: PChar; dwFlags: DWORD): HINTERNET; stdcall; Укажи их все и какачай как обычно Добавлено в lpszAgent <-|Имя программы, с помощью которой мы соединяемся, |может принимать любые значения dwAccessType <-|Каким макаром соединяться с и-нетом |принимаемые значения: | PRE_CONFIG_INTERNET_ACCESS -как в системном реестре | LOCAL_INTERNET_ACCESS -напрямую | GATEWAY_INTERNET_ACCESS -через GateWay | CERN_PROXY_INTERNET_ACCESS -через проксю lpszProxy <-|Имя прокси сервера (ставим в nil) lpszProxyBypass<-|Не уверен, но смахивает на имена хостов, для которых не |использовать проксю (ставим в nil) dwFlags <-|Принимаеемые значения: | INTERNET_FLAG_ASYNC -этот запрос асинхронный (если есть | поддержка), но мы поставим 0 } Я не_ПРОБОВАЛ |
Сообщ.
#4
,
|
|
|
на яндексе пример обрашения к
function InternetConnect(hInet: HINTERNET; lpszServerName: PChar; nServerPort: INTERNET_PORT; lpszUsername: PChar; lpszPassword: PChar; dwService: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall; function FtpGetFile(hConnect: HINTERNET; lpszRemoteFile: PChar; lpszNewFile: PChar; fFailIfExists: BOOL; dwFlagsAndAttributes: DWORD; dwFlags: DWORD; dwContext: DWORD): BOOL stdcall; |
Сообщ.
#5
,
|
|||
|
Увы, если поставить в вызов InternetOpen dwAccessType = PRE_CONFIG_INTERNET_ACCESS (как в системном реестре) то авторизация на proxy все равно не проходит, хотя у IE проблем не возникает. Если-же подставить dwAccessType = CERN_PROXY_INTERNET_ACCESS (через проксю), то не понятно куда засунуть имя и пароль для авторизации на Proxy. |
Сообщ.
#6
,
|
|
|
С InternetConnect я эксперементировал, тоже неудачно, возможно что-то делал не так. К сожалению, доступ к сетке в которой возникла данная проблема, у меня ограничен. Поэтому не довел работу до конца. Просто нашел "кривое" решение: посредством TWebBrowser - уж он-то знает как . Дыра была заткнута.
|
Сообщ.
#7
,
|
|||
|
Я поставм\ил локальный прокси и локальный http сервера Www 80 порт прокси 8080 порт fileURL:string='http://localhost/cgi-bin/test_pg.cgi?Проверка_iз_Дельфи' +' hq qq' ; procedure TForm1.Button1Click(Sender: TObject); // 74*30 2100 + 120 = 22000 const BufferSize = 1024; var hSession, hURL: HInternet; Buffer: array[0..BufferSize] of Byte; BufferLen: DWORD; //f: File; sAppName: string; function strr:string; var r:string; ir:integer; begin r:=''; for ir:=0 to BufferLen do r:=r + chr(Buffer[ir]); result:=r; end; begin fileURL:=fileURL+inttostr(random(100)); memo1.Clear; sAppName := 'pigas_броузер_мля'; BufferLen:=0; { function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: PChar; dwFlags: DWORD): HINTERNET; stdcall; } hSession := InternetOpen(PChar(sAppName), // имя броузера INTERNET_OPEN_TYPE_PROXY , // мол юзается прокси 'localhost:8080', // имя прокси '', // не знаю чего за параметр ISO_FORCE_DISCONNECTED); // чегото связанное с отключением { function InternetConnect(hInet: HINTERNET; lpszServerName: PChar; nServerPort: INTERNET_PORT; lpszUsername: PChar; lpszPassword: PChar; dwService: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall; } // hSession:=InternetConnect(hSession,'localhost',8080,'Юзер','Пасс',0,INTERNET_REQFLAG_VIA_PROXY,0); // showmessage(inttostr(integer(hSession))); try hURL := InternetOpenURL(hSession, PChar(fileURL), 'Accept: */*',11, // длина того чего Accept // INTERNET_FLAG_EXISTING_CONNECT, INTERNET_FLAG_RAW_DATA, WININET_API_FLAG_SYNC); try repeat InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); memo1.Lines.Add(strr); until BufferLen = 0; finally InternetCloseHandle(hURL) ; end; finally InternetCloseHandle(hSession); end; end; |
Сообщ.
#8
,
|
|||||
|
А почему закоментировано? У меня все было именно так и написанно как у тебя, правда InternetConnect при это не дергал (в пртчем как и ты). При этом, если proxy был без авторизации, то все Ок. А вот если Proxy требовал имя и пароль, то вместо требуемой страницы, я получал страничку с сообщением об ошибке авторизации. Добавление InternetConnect мне не помогло. И вообще, мне не понятно, что делать с результатом InternetConnect? В MSDN про InternetConnect сказано:
На сколько я понимаю, с таким хендлом в InternetOpenURL уже нельза соваться. |
Сообщ.
#9
,
|
|
|
Я это к тому что к своему проксику ( без авторизации ) я смог вот так подключится
hSession := InternetOpen(PChar(sAppName), // имя броузера INTERNET_OPEN_TYPE_PROXY , // мол юзается прокси 'localhost:8080', // имя прокси '', // не знаю чего за параметр ISO_FORCE_DISCONNECTED); // чегото связанное с отключением А после вызова hSession:=InternetConnect(hSession,'localhost',8080,'Юзер','Пасс',0,INTERNET_REQFLAG_VIA_PROXY,0); Получается так что hSession = nil Ну и конечно дальше ничего не работает Петрович ,а с какими ты параметрами пробовал InternetConnect ? Еслиб работал InternetConnect можно былобы цепочку прокси сделать ............. |
Сообщ.
#10
,
|
|||||||
|
Во, во, а в теме-то сразу было сказанно Proxy Authentication. Без авторизации проблем нет.
Вообще-то, я вызывал ее приблизительно так (для твоего случая):
Только мне кажется что результат InternetConnect надо подавать на вход HttpOpenRequest. Это во первых. А во вторых, суда по описанию в MSDN, имя и пароль в InternetConnect имеются в виду не для proxy, а непосредственно для сервера (http, ftp, gopher). |
Сообщ.
#11
,
|
|
|
Тема актуальная. У меня прокся без басик авторизации. Выйти за нее, я тоже не могу. TWebBrowser в моем случае мало пока чем помогает.
Кратенько. Общаюсь по средствам Get и Post с сервачком. Внимание, требуется прога примитивненькая (4 эдита 2 баттона), котороая позволит отправлять Post через мою проксю. Денежное вознаграждение гарантирую (не очень большое). |
Сообщ.
#12
,
|
|||
|
Да я и не думал, что это окажется так сложно. Единственное что я пока нашел это работа через IdHTTP
|
Сообщ.
#13
,
|
|
|
Вот такая строка (..."GET ftp://ftpservername/file.zip HTTP/1.1" ...) инициализируется на прокси при запросе с IE (ftp://ftpservername/file.zip), тогда идет запрос на аутентификацию и.т.д - файл закачивается без проблем.
При использовании в качестве сервиса INTERNET_SERVICE_ftp ... hConnectHandle := InternetConnect ( hOpenHandle, 'ftpservername', INTERNET_INVALID_PORT_NUMBER, nil, nil, INTERNET_SERVICE_ftp, 0, 0 ); httpOpenRequest() на выходе nil , а если подставить INTERNET_SERVICE_HTTP, тогда идет все нормально (т.е. идет запрос на аутентификацию), в логе прокси ..."GET http://ftpservername/file.zip HTTP/1.1" ..." Вопрос - Как сделать запрос ресурса такой же как в IE? т.е. (..."GET ftp://ftpservername/file.zip HTTP/1.1" ...) Чтобы потом можно было бы закачать этот ресурс доступными методами.... ЗЫ. Хочется как в IE... |
Сообщ.
#14
,
|
|
|
Zvik
Чейто я не понял. Ты говоришь идет запрос на аутентификацию, а где ты ему (proxy) сообщаешь имя и пароль для аутентификации? Еще раз напоминаю: мой прокси ЗАПАРАЛИРОВАН, и ТРЕБУЕТ ОБЯЗАТЕЛЬНОЙ АУТЕНТИФИКАЦИИ. |
Сообщ.
#15
,
|
|
|
Аутентификация работает при http сервисе. Я просто думаю, нельзя ли сначала ввести логин и пароль при этом сервисе а потом как-то используя InternetOpenURL, подключиться к этому же ресурсу, но только ввести уже "hUrl:='ftp://servername/file.zip'".
P.S. У меня тоже прокси, требующий аутентификацию... Не верю, что нельзя пробиться, IE как-то же работает. |
Сообщ.
#16
,
|
|||
|
А это уже совсем другой ресурс. http-сервис и ftp-сервис - это совершенно разные ресурсы. Более того прокси может один из них обслуживать а другой нет. |
Сообщ.
#17
,
|
|
|
Нашел...
Q216214 SAMPLE: FTP with CERN-Based Password Protected Proxy Там это вроде описано, есть пример на Си. Вроде работает, теперь надо на делфи перекинуть. |
Сообщ.
#18
,
|
|||
|
А чего ссылочку не положил? |
Сообщ.
#20
,
|
|
|
Пофлудю и я.
Использую методы протокола HTTP сервер отвечает на запросы по средством кодов. Через проксю ходят так называемо "туннелированием". То есть все запросу шлються непосредствеено на проксю, а в теле запроса в определенных полях методов пишется конечный получатель запроса (учите матчасть HTTP). В нашем случае, "первичным" сервером является прокся. Прокся на любой запрос от вашего приложения (в том числе и ИЕ) отвечает кодом 407, что в переводе на русский означает требуется авторизация , где в теле ответа содержиться перечень алгоритмов криптования, поддерживающих сервером(проксей). ИЕ обращается к контроллеру доменов, и если находит вас там, то берет логи и пароль и криптует(шифрует) строку Login:Pass одним из алгоритмов , понимаемым сервером(проксей). Перепосылает запрос с добавлением строки ( не помню синтаксис) о том, мол вот тебе криптованный аух. Прокся расзкриптовывает и смотрит уже у себя, такой юзверь с таким пасом могет ходить за проксю или нет. Ежели может, то ок, скидывает оболчку туннеля с запроса, и отправляет запрос далее. На нет и суда нет. Вот. Я бодался с криптованием 2-3 месяца. Исползовал Индевые компоненты. Гавно - скажу я вам. Либо я тупой, либо они не ходят через прокси без Basic авторизации. Кому интересно, могу дать линк на мои исследование в области сырцов Indy. Без авторизации, имхо, можно не выпендриваться и заюзать обнакновенные сокеты подучив HTTP |