![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще раз про работу с https в INDY [D6, WinME, Win2k, WinXP]
SergP. © (2005-09-26 14:45:00)Создал новую ветку, так как в старой сначала был немного другой вопрос....
Вобщем:
Нужно скачать некую инфу по https.
Проблема в том что при использовании INDY выскакивает сообщение о том что не загружена какая-то SSL library.
Но помню когда-то я делал такое на д5 (Инди скачивал и устанавливал отдельно) и все работало, никто не требовал никакой библиотеки...
В данном случае у меня Д6 с ИНДИ которая шла в комплекте с Д6.
Из-за чело это так?
Как выйти из положения?
SergP (2005-11-26 14:30:00) [1]И еще один вопрос есть:
Хочу отобразить процесс закачивания данных.
Для этого нужно получить размер контента до того как будет приниматься этот контент. Т.е. мне нужен либо размер контента, либо что-нить откуда можно будет выдрать нужную информацию (например весь заголовок ответа сервера).
Как можно получить размер контента?
Использую для закачки код, основаный на [6].
isasa (2005-10-21 22:08:00) [2]Так, устраняется правкой реестра...То что выше заданого в реестре параметра будет ожидать своей очереди.
Точно так
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000020
"MaxConnectionsPer1_0Server"=dword:00000020
o2 (2005-10-21 21:38:00) [3]нужна помощь ! я попробовал соединиться с https://www.chel.mts.ru/sms/cgi-bin/cgi_.exe?function=sms_send , но у меня функция HttpSendRequest выдала false. Ошибка 12045 The function is unfamiliar with the Certificate Authority that generated the server's certificate... У них там какой то сертификат глючный. Как сделать, чтобы функция забила на то что сертификат unfamiliar ?
Seeker (2005-10-17 11:49:00) [4]
> А вот как с куками оно работает?
> Пробовал скачивать страничку с сервера, который меня авторизует
> по кукам - все работает. Куки передаются как положено.
> Но для чего переменная cookies нужна - понять не могу...
>
Это кусок моего кода(подчищенный).Мой полный код сам обрабатывает куки без сохренения те работает с флагом NOCOOKIES если выставить этот флаг, то через cookies можно передавать нужные тебекукисы.
SergP. (2005-10-15 13:32:00) [5]А вот как с куками оно работает?
Пробовал скачивать страничку с сервера, который меня авторизует по кукам - все работает. Куки передаются как положено.
Но для чего переменная cookies нужна - понять не могу...
seeker (2005-09-29 14:53:00) [6]Да, когда удалял лишнее прибил случайно, но можно было догадаться что Fdata и Data Одно и тоже.
SergP. (2005-09-29 13:35:00) [7]И еще... Я не совсем понял как отправлять POST-запросы...
Например сервер поддерживает как GET так и POST
но GET наверное не подойдет в случае если URL слишком длинный получается. (просто в некоторых случаях приходится очень много параметров передается).
Каким образом я должен передавать POST-данные в
function OpenURL(Metod, URL:string; Data:string=''; Header:string=''): string;
?
А то что-то не вижу... Например Data - нигде не используется
Seeker (2005-09-29 09:53:00) [8]
> 1. можно ли запускать [6] в отдельном потоке?
Да
> 2. Можно ли изменять текущие параметры прокси для [6] с
> помощью UrlMkSetSessionOption ?
Можно их напрямую указать в InternetOpen
InternetOpen('Delphi',INTERNET_OPEN_TYPE_PROXY, PChar(Proxy),nil,1);
</
> 3. Где-то читал про ограничения при использовании WinInet
> на количество соединений. Так ли это? Что будет если я попытаюсь
> создать больше?
Так, устраняется правкой реестра...То что выше заданого в реестре параметра будет ожидать своей очереди.
CODE>
SergP. (2005-09-28 15:44:00) [9]И еще парочка вопросов:
1. можно ли запускать [6] в отдельном потоке?
2. Можно ли изменять текущие параметры прокси для [6] с помощью UrlMkSetSessionOption ?
3. Где-то читал про ограничения при использовании WinInet на количество соединений. Так ли это? Что будет если я попытаюсь создать больше?
SergP. (2005-09-28 10:12:00) [10]
> Seeker © (28.09.05 09:36) [6]
Я сначала пробовал сам писать, но видно что-то не то делал так как у меня HttpSendRequest постоянно возвращал false.
А твой пример работает. только что проверял. Большое спасибо...
Щас буду с ним разбираться...
Seeker (2005-09-28 09:36:00) [11]
> Если не трудно примерчик не приведете?
Uses ...WinInet, ...
...
function OpenURL(Metod, URL:string; Data:string=''; Header:string=''): string;
var
FSession, FConnect, FRequest: HINTERNET;
FMetod,FURL,FData,Cookies:string;
BytesRead,BuffSize:cardinal;
Buff:String;
dwFlag:Cardinal;
gotIt: boolean;
URLC:TURLComponents;
tout:Integer;
HostName,UrlPath:array[1..INTERNET_MAX_PATH_LENGTH] of char;
ExtraInfo:array[1..$ffff] of char;
begin
if trim(Metod) = '' then FMetod:='GET' else FMetod:=Trim(UpperCase(Metod));
Result:='';
if pos('://',URL)= 0 then
FURL:='http://'
else FURL:='';
FURL:=FURL+URL;
FillChar(URLC,SizeOf(TURLComponents),0);
with URLC do
begin
dwStructSize := sizeOf(TURLComponents);
lpSzExtraInfo := @ExtraInfo[1];
dwExtraInfoLength := INTERNET_MAX_PATH_LENGTH;
lpSzHostName := @HostName[1];
dwHostNameLength := INTERNET_MAX_PATH_LENGTH;
lpszUrlPath := @UrlPath[1];
dwUrlPathLength := INTERNET_MAX_PATH_LENGTH;
end;
InternetCrackUrl(PChar(FURL),0,ICU_ESCAPE, URLC);
FSession := InternetOpen('Delphi', INTERNET_OPEN_TYPE_PRECONFIG , nil, nil, 0);
if Assigned(FSession) then
begin
try
tout:=10*1000;
InternetSetOption(FSession, INTERNET_OPTION_RECEIVE_TIMEOUT,@tout,SizeOf(tout));
FConnect := InternetConnect(FSession,
URLC.lpszHostName,
URLC.nPort,
nil,
nil,
INTERNET_SERVICE_HTTP,
0,
0);
if Assigned(FConnect) then
begin
try
if URLC.nPort = 443 then
dwFlag := INTERNET_FLAG_SECURE
or INTERNET_FLAG_IGNORE_CERT_CN_INVALID
or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
else
dwFlag := 0;
dwFlag := dwFlag or INTERNET_FLAG_RELOAD;
StrCat(URLC.lpSzUrlPath, URLC.lpszExtraInfo);
URLC.lpSzExtraInfo := #0;
URLC.dwExtraInfoLength := 0;
if FMetod = 'GET' then
begin
if FData '' then
begin
if pos('?', URLC.lpszUrlPath) = 0 then
FData:='?'+FData
else
FData:='&'+FData ;
StrCat(URLC.lpszUrlPath,PAnsiChar(FData));
FData:='';
end;
end;
URLC.dwUrlPathLength:=length(URLC.lpszUrlPath);
FRequest := HttpOpenRequest(FConnect, PChar(FMetod), URLC.lpszUrlPath, 'HTTP/1.0',
nil,
nil,
dwFlag,
0);
if Assigned(FRequest) then
begin
if pos('?', URLC.lpSzExtraInfo) = 1 then
begin
inc(URLC.lpSzExtraInfo);
dec(URLC.dwExtraInfoLength);
end;
if FData '' then
begin
URLC.lpszExtraInfo:=PAnsiChar(FData);
FData:='';
end;
URLC.dwExtraInfoLength := length(URLC.lpSzExtraInfo);
if FMetod='POST' then
Header:='Content-Type: application/x-www-form-urlencoded';
if Cookies '' then
begin
if pos('Cookies: ',Cookies) = 0 then
if Header '' then
Header:=Header+ #13#10+'Cookie: '+Cookies
else
Header:='Cookie: '+Cookies ;
end;
try
if HttpSendRequest(FRequest,PChar(Header), Length(Header), URLC.lpszExtraInfo, URLC.dwExtraInfoLength) then
begin
//Read file
BuffSize:=1024;
repeat
BytesRead:=0;
SetLength(buff,BuffSize);
gotIt := InternetReadFile(FRequest, @Buff[1], BuffSize, bytesRead);
Setlength(Buff,BytesRead);
Result:=Result+Buff;
until (gotIt and (bytesRead = 0));
end
else
begin
// не могу отослать запрос
end;
finally
InternetCloseHandle(FRequest);
end;
end
else
begin
end;
finally
InternetCloseHandle(FConnect);
end;
end
else
begin
end;
finally
InternetCloseHandle(FSession);
end;
end
else
begin
end;
end;
SergP. (2005-09-28 09:30:00) [12]
> S@ska (27.09.05 22:32) [4]
Во первых прочитай сабжевый пост, во вторых на днях убрал бывшую Инди и поставил Инди 10, так вот даже там такой штуки как IdOpenSSlCleint нет....
Есть TIdSSLIOHandlerSocketOpenSSL, но читай сабжевый пост.
И в третьих цитируемые тобой предложения касались Wininet а не Инди
S@ska (2005-09-27 22:32:00) [13]
> Если не трудно примерчик не приведете?
> Требуется всего-лишь скачать инфу по урлу https://.....
> и поместить ее в переменную типа string
Берешь IdHTTP и цепляешь к нему IdOpenSSlCleint собственно все работаешь также как с просто IdHTTP
SergP. (2005-09-27 18:25:00) [14]
> Seeker © (27.09.05 12:15) [1]
>
> > Как выйти из положения?
>
> А без инди обойтись не судьба?
> Есть такая штука как WinInet.
Если не трудно примерчик не приведете?
Требуется всего-лишь скачать инфу по урлу https://.....
и поместить ее в переменную типа string
S@shka (2005-09-27 14:44:00) [15]Дык естественно надо скачать SLL библиотеку ))) О чем и говорится.
Для особо любознательных ....
http://www.indyproject.org/Sockets/SSL.iwp
Seeker (2005-09-27 12:15:00) [16]
> Как выйти из положения?
А без инди обойтись не судьба?
Есть такая штука как WinInet.