![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с Indy [D7]
SDF © (2003-11-06 08:01:00)
Всем привы.
Кратко. Поставил 7 дельфу.. Там инди... Попробовал по наитию, нифига не получается. Доку почиталд, попробовал еще раз - аналогично. Кто пожертвует своим временем (сильно теранить не буду) и поотвечает мне на вопросы посредством мыла.
Заранее благодарный.
SDF (2003-12-04 06:59:00) [1]
Ладно... Придется писать свое... Заодно и разберусь получшее.
SDF (2003-12-03 09:58:00) [2]
Может кто-нить поможет, а?
SDF (2003-12-02 15:14:00) [3]
На меня тут куча траблов свалилось, посему пришлось завязать с этим делом...
Седня возобновил копание ....
Тут, короче или я тупой, или одно из двух.
Итак...
После мыканиям по методам класса TIdHttp залетаем сюда
function TIdCustomHTTP.DoOnProxyAuthorization(ARequest: TIdHTTPRequest; AResponse: TIdHTTPResponse): Boolean;
вот "проблемный код"
4* if Assigned(FOnSelectProxyAuthorization) then
begin
OnSelectProxyAuthorization(self, Auth, AResponse.ProxyAuthenticate);
end;
ProxyParams.Authentication := Auth.Create;
end;
1* result := Assigned(OnProxyAuthorization);
// Clear password and reset autorization if previous failed
2* if (AResponse.FResponseCode = 407) then begin
ProxyParams.ProxyPassword := "";
ProxyParams.Authentication.Reset;
end;
if Result then
begin
with ProxyParams.Authentication do
begin
Username := ProxyParams.ProxyUsername;
Password := ProxyParams.ProxyPassword;
AuthParams := AResponse.ProxyAuthenticate;
end;
result := false;
repeat
3* case ProxyParams.Authentication.Next of
wnAskTheProgram: // Ask the user porgram to supply us with authorization information
begin
if Assigned(OnProxyAuthorization) then
begin
ProxyParams.Authentication.Username := ProxyParams.ProxyUsername;
ProxyParams.Authentication.Password := ProxyParams.ProxyPassword;
OnProxyAuthorization(self, ProxyParams.Authentication, result);
if result then begin
ProxyParams.ProxyUsername := ProxyParams.Authentication.Username;
ProxyParams.ProxyPassword := ProxyParams.Authentication.Password;
end
else begin
break;
end;
end;
end;
wnDoRequest:
begin
result := true;
break;
end;
wnFail:
begin
result := False;
Break;
end;
end;
until false;
end;
(1*) Выделенный фрагмент , имхо, олицетворяет (не)успешное выполнения всей авторизации на проксе.
Гуд, ежели так, ставим обработку события.
(2*)Далее следует код, который лично меня, приводит в заблуждение.
Зачем, спрашивается, скидывать настройки прокси? Ну да ладно, судить разработчиков - дело неблагодарное...
Идем далее....
(3*)Насколько я понимаю выделенную строку выбирается то, что мы будем делать далее.
Из 3-х возможных вариантов, в данном случае нас устраивает только первый, ведь авторизацию мы так и не получили...
Пойдем внуть Функции Next.
Я не буду приводить код той функции, скажу только, что нужный нам резалт мы получим, при условии, что занулен параметр авторизации Login.
Тепрь поднимемся выше по коду (4*).
Оказывается, это событие тоже нужно обрабатывать, причем "//" нам не обойтись, нужно занулить Логин и установить result=True;
И все равно, не авторизируется и баста...
Копаем дальше.
SDF (2003-11-24 08:19:00) [4]
Продолжим...
В итоге накопалось, что нету пары dll. Скачено, поставлено - не работает. Кто подскажет дальше...
Klyonov -не могу ответить на твое мыло...
klyonov (2003-11-21 19:51:00) [5]
и вообще у кого-нибудь получилось залезть за проксю с не-Basic-авторизацией через Indy?
klyonov (2003-11-21 19:48:00) [6]
а у тебя получилось пролезть за проксю с этим NTLM?
SDF (2003-11-21 05:53:00) [7]
Ошибка заключалась в следующем...
В последнем приведенном коде, производится перебор всех зарегенных классов аутентификации. А таковых, без подключения юнитов, не имеется. Я подкинул модуль с Ntml криптованием. Там при инициализации модуля стоит регистрация класса.
Бац, и получилось....
Теперь осталось правильно сляпать запрос и тскать следующий баг :)
Digitman (2003-11-20 17:07:00) [8]
"лед тронулся, господа присяжные заседатели !"
(c) О.И.С.Б.М.Бендер-бей
))
SDF (2003-11-20 16:24:00) [9]
Все, покрайней мере этот баг устранил....
Копаю дальше...
SDF (2003-11-20 14:25:00) [10]
Накопал вот что, постараюсь пркомментировать мои мыслы...
Хотелось бы услышать и другие мнения...
И так, ошибка генерится вот где.
var
i: Integer;
S: string;
Auth: TIdAuthenticationClass;
begin
Inc(FAuthProxyRetries);
if not Assigned(ProxyParams.Authentication) then
begin
// Find wich Authentication method is supported from us.
for i := 0 to AResponse.ProxyAuthenticate.Count - 1 do
begin
S := AResponse.ProxyAuthenticate[i];
try
Auth := FindAuthClass(Fetch(S));
break;
except
end;
end;
if i = AResponse.ProxyAuthenticate.Count then
begin
result := false;
exit;
end;
if Assigned(FOnSelectProxyAuthorization) then
begin
OnSelectProxyAuthorization(self, Auth, AResponse.ProxyAuthenticate);
end;
ProxyParams.Authentication := Auth.Create;
end;
Давайте вместе пораскинем мозгами..
Предыстория. Залетаем мы сюда при ответе прокси кодом 407 (авторизацию подавай).
Увеличиваем попытки авторизоваться на 1.
Далее проверяем, если определен некий Authentication, что является пропертей проперти нашего компонента TIdHttp->ProxyParams->Authentication
ProxyParams является ссылкой на объект класса TIdProxyConnectionInfo .
Authentication - ссылка на объект класса TIdAuthentication
разберем детально блок вот какой....
// Find wich Authentication method is supported from us.
for i := 0 to AResponse.ProxyAuthenticate.Count - 1 do
begin
S := AResponse.ProxyAuthenticate[i];
try
Auth := FindAuthClass(Fetch(S));
break;
except
end;
end;
Продолжение следует...
Reindeer Moss Eater (2003-11-20 14:06:00) [11]
Залез я пока в сорцы инди....
И это правильно. Нужно быть уверенным в себе.
Если уж написал код, так такой, чтоб без греха, чтоб не надо было проверять где причина AV.
Остается больше времени для исследования причин возникновения AV в исходниках библиотек. Ну и фиг с ним, что они тыщу лет OpenSource и исследованы сотнями и тысячами пар глаз.
SDF (2003-11-20 14:06:00) [12]
Ошибка возникает в методе
TIdCustomHTTP.DoOnProxyAuthorization
Пока не понял почему...
SDF (2003-11-20 13:46:00) [13]
Залез я пока в сорцы инди....
Digitman (2003-11-20 13:28:00) [14]
> а где такой отладчик, чтоб внутренности компонент трассировать?
да все тот же встроенный отладчик Делфи !
а что, ты уже точно выяснил, что факт.параметры, поступающие на вход метода - в полном порядке ? Никаких неожиданностей ? И причина AV уводит вглубь кода компонента ? Что-то сомневаюсь я в этом)...
пересобери-ка свой проект с опцией Build With Run-Time Packages и приведи повторно дословный текст исключения ... по адресу, фигурирующему в тексте исключения, сразу будет видно, какой модуль "нарвался" на AV : модуль твоего хост-приложения или BPL в составе Инди
Reindeer Moss Eater (2003-11-20 13:26:00) [15]
HTTP.Post(cbURL.Text, mePostData.Lines, Response);
Если AV действительнона этой строке, то нет cbURL и (или) mePostData
SDF (2003-11-20 13:20:00) [16]
Ссори за оффтопик, но скажи мне плз, а где такой отладчик, чтоб внутренности компонент трассировать?
SDF (2003-11-20 13:19:00) [17]
Send HTTP data to a web server or CGI program.
function Post(AURL: string; const ASource: TStrings): string; overload;
AUrl=текст комбобокса
ASource= "линии" мемо...
Где ошибка?
Digitman (2003-11-20 13:15:00) [18]
> SDF
брось ты метод научного тыка)
на то есть встр.отладчик, пошаговая трассировка проблемного кода его средствами всегда покажет то, что пропустил глаз или забыла/не знала голова)
SDF (2003-11-20 13:10:00) [19]
Хорошо, я убрал Response (благо есть такой метод)
Ошибка осталась...
Digitman (2003-11-20 13:09:00) [20]
> SDF
наконец-то разродился чем-то конкретным)
и сразу стало понятным, что ни прокси, ни авторизации, ни Инди здесь ни при чем !
факт налицо : один (или более) из 3-х факт.параметров вызова метода HTTP.Post() некорректен/недопустим
отладчик тебе в руки и - вперед ! трасиировка всегда поможет !