Форум: "Сети";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизЕще раз про работу с https в INDY Найти похожие ветки
← →
SergP. (2005-09-26 14:45) [0]Создал новую ветку, так как в старой сначала был немного другой вопрос....
Вобщем:
Нужно скачать некую инфу по https.
Проблема в том что при использовании INDY выскакивает сообщение о том что не загружена какая-то SSL library.
Но помню когда-то я делал такое на д5 (Инди скачивал и устанавливал отдельно) и все работало, никто не требовал никакой библиотеки...
В данном случае у меня Д6 с ИНДИ которая шла в комплекте с Д6.
Из-за чело это так?
Как выйти из положения?
← →
Seeker © (2005-09-27 12:15) [1]
> Как выйти из положения?
А без инди обойтись не судьба?
Есть такая штука как WinInet.
← →
S@shka © (2005-09-27 14:44) [2]Дык естественно надо скачать SLL библиотеку ))) О чем и говорится.
Для особо любознательных ....
http://www.indyproject.org/Sockets/SSL.iwp
← →
SergP. (2005-09-27 18:25) [3]
> Seeker © (27.09.05 12:15) [1]
>
> > Как выйти из положения?
>
> А без инди обойтись не судьба?
> Есть такая штука как WinInet.
Если не трудно примерчик не приведете?
Требуется всего-лишь скачать инфу по урлу https://.....
и поместить ее в переменную типа string
← →
S@ska (2005-09-27 22:32) [4]
> Если не трудно примерчик не приведете?
> Требуется всего-лишь скачать инфу по урлу https://.....
> и поместить ее в переменную типа string
Берешь IdHTTP и цепляешь к нему IdOpenSSlCleint собственно все работаешь также как с просто IdHTTP
← →
SergP. (2005-09-28 09:30) [5]
> S@ska (27.09.05 22:32) [4]
Во первых прочитай сабжевый пост, во вторых на днях убрал бывшую Инди и поставил Инди 10, так вот даже там такой штуки как IdOpenSSlCleint нет....
Есть TIdSSLIOHandlerSocketOpenSSL, но читай сабжевый пост.
И в третьих цитируемые тобой предложения касались Wininet а не Инди
← →
Seeker © (2005-09-28 09:36) [6]
> Если не трудно примерчик не приведете?
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 10:12) [7]
> Seeker © (28.09.05 09:36) [6]
Я сначала пробовал сам писать, но видно что-то не то делал так как у меня HttpSendRequest постоянно возвращал false.
А твой пример работает. только что проверял. Большое спасибо...
Щас буду с ним разбираться...
← →
SergP. (2005-09-28 15:44) [8]И еще парочка вопросов:
1. можно ли запускать [6] в отдельном потоке?
2. Можно ли изменять текущие параметры прокси для [6] с помощью UrlMkSetSessionOption ?
3. Где-то читал про ограничения при использовании WinInet на количество соединений. Так ли это? Что будет если я попытаюсь создать больше?
← →
Seeker © (2005-09-29 09:53) [9]
> 1. можно ли запускать [6] в отдельном потоке?
Да
> 2. Можно ли изменять текущие параметры прокси для [6] с
> помощью UrlMkSetSessionOption ?
Можно их напрямую указать в InternetOpenInternetOpen("Delphi",INTERNET_OPEN_TYPE_PROXY, PChar(Proxy),nil,1);
</
> 3. Где-то читал про ограничения при использовании WinInet
> на количество соединений. Так ли это? Что будет если я попытаюсь
> создать больше?
Так, устраняется правкой реестра...То что выше заданого в реестре параметра будет ожидать своей очереди.
CODE>
← →
SergP. (2005-09-29 13:35) [10]И еще... Я не совсем понял как отправлять POST-запросы...
Например сервер поддерживает как GET так и POST
но GET наверное не подойдет в случае если URL слишком длинный получается. (просто в некоторых случаях приходится очень много параметров передается).
Каким образом я должен передавать POST-данные в
function OpenURL(Metod, URL:string; Data:string=""; Header:string=""): string;
?
А то что-то не вижу... Например Data - нигде не используется
← →
seeker © (2005-09-29 14:53) [11]Да, когда удалял лишнее прибил случайно, но можно было догадаться что Fdata и Data Одно и тоже.
← →
SergP. (2005-10-15 13:32) [12]А вот как с куками оно работает?
Пробовал скачивать страничку с сервера, который меня авторизует по кукам - все работает. Куки передаются как положено.
Но для чего переменная cookies нужна - понять не могу...
← →
Seeker © (2005-10-17 11:49) [13]
> А вот как с куками оно работает?
> Пробовал скачивать страничку с сервера, который меня авторизует
> по кукам - все работает. Куки передаются как положено.
> Но для чего переменная cookies нужна - понять не могу...
>
Это кусок моего кода(подчищенный).Мой полный код сам обрабатывает куки без сохренения те работает с флагом NOCOOKIES если выставить этот флаг, то через cookies можно передавать нужные тебе кукисы.
← →
o2 (2005-10-21 21:38) [14]нужна помощь ! я попробовал соединиться с 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 ?
← →
isasa © (2005-10-21 22:08) [15]Так, устраняется правкой реестра...То что выше заданого в реестре параметра будет ожидать своей очереди.
Точно так
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000020
"MaxConnectionsPer1_0Server"=dword:00000020
← →
SergP © (2005-11-26 14:30) [16]И еще один вопрос есть:
Хочу отобразить процесс закачивания данных.
Для этого нужно получить размер контента до того как будет приниматься этот контент. Т.е. мне нужен либо размер контента, либо что-нить откуда можно будет выдрать нужную информацию (например весь заголовок ответа сервера).
Как можно получить размер контента?
Использую для закачки код, основаный на [6].
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.016 c