Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

Как получить информацию по HTTPS?   Найти похожие ветки 

 
Cyr ©   (2006-02-21 16:56) [0]

Как получить информацию по HTTPS?


 
seeker ©   (2006-02-21 17:22) [1]

C помощью WinInet...


 
umbra ©   (2006-02-21 18:19) [2]

с помощью Indy


 
Cyr ©   (2006-02-21 19:41) [3]

А как проще?
Нужно, чтобы прога подключалась к сайту статистики провайдера, вводила имя и пароль, принимала сертификат, и скачивала статистику пользования инетом. А в будущем ещё и меняла тарифный план.


 
Cyr ©   (2006-02-22 11:21) [4]

Ну дык это невозможно реализовать?


 
umbra ©   (2006-02-22 11:38) [5]

что касается инди, то я не знаю, можно ли получить сертификат. Все остальное возможно. демо-проект можно скачать с http://adg.bmpcoe.org/IndySSL/Indy9SSLExample.zip


 
Reindeer Moss Eater ©   (2006-02-22 11:47) [6]

Сертификат сам приедет с сервера.
Вам останется только решить, доверять ему или нет.


 
seeker ©   (2006-02-22 13:37) [7]

Да, поист пользовать нехотим...

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;


 
Cyr ©   (2006-02-22 14:19) [8]

seeker, пробовал я ваш пример уже, перед тем как сюда писать.
Не работает.
Переходит в то место, где // не могу отослать запрос.

Reindeer Moss Eater, как программно безусловно принимать сертификат?


 
Cyr ©   (2006-02-22 14:43) [9]

Кстати, если сертификат один раз импортировать в файл  .cer,
можно ли его использовать сразу при коннекте не дожидаясь повторного прихода от провайдера?
Думаю, что пример с Indy от umbra будет попроще, чем с WinInet...


 
SergP.   (2006-02-23 17:27) [10]


> Cyr ©   (22.02.06 14:19) [8]
> seeker, пробовал я ваш пример уже, перед тем как сюда писать.
>
> Не работает.


Странно.. Я пробовал тот-же пример.. У меня работает...


 
Cyr ©   (2006-02-23 18:01) [11]

SergP, видимо в вашем случае не требуется вводить имя и пароль.

У меня заработал вот этот пример:
http://forum.vingrad.ru/index.php?showtopic=63257&view=findpost&p=511957
uses IdHTTP, IdSSLOpenSSL;

function GetSSLHttp(url, user, password, FileName: string;  PortNum: integer=443):boolean;
var
 http: TIdHTTP;
 ssl:  TIdSSLIOHandlerSocket;
 ms:   TMemoryStream;
begin
 http := TIdHTTP.Create(nil);
 ssl := TIdSSLIOHandlerSocket.Create(http);
 ms := TMemoryStream.Create;
 http.Port := PortNum;
 http.IOHandler := ssl;
 http.Request.Username := user;
 http.Request.Password:=password;
 http.Request.BasicAuthentication := true;
 try
   http.Get(url, ms);
   result:=true;
 ms.SaveToFile(FileName);
 except
   result :=false;
 end;
 ms.Free;
 http.Free;
end;

Теперь ещё осталось разобраться, как по https отправлять данные...


 
umbra ©   (2006-02-23 18:45) [12]

точног так же, как и по HTTP, если уж соединение установлено


 
seeker ©   (2006-02-24 13:20) [13]


> SergP, видимо в вашем случае не требуется вводить имя и
> пароль.

А пароль вводится в форме на странице или в выскакивающем окне?


 
seeker ©   (2006-02-24 13:27) [14]

это дя стандартных авторизаций.

...
FConnect := InternetConnect(FSession,
                               URLC.lpszHostName,
                               URLC.nPort,
                               lpszUserName,
                               lpszPassword,
                               INTERNET_SERVICE_HTTP,
                               0,
                               0);
...


 
Cyr ©   (2006-02-25 16:02) [15]


> А пароль вводится в форме на странице или в выскакивающем
> окне?

В выскакивающем окне.



Страницы: 1 вся ветка

Текущий архив: 2006.07.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.039 c
15-1149483514
Ega23
2006-06-05 08:58
2006.07.02
С Днём рождения! 4 июня


15-1149432235
Rsegg
2006-06-04 18:43
2006.07.02
Просканировать процесс


2-1150209570
Марина
2006-06-13 18:39
2006.07.02
Сохраниние ячеек таблицы


2-1149857266
webpauk
2006-06-09 16:47
2006.07.02
Установить курсор на кнопку


3-1146644994
Juice
2006-05-03 12:29
2006.07.02
LangId_To_CodePage - Ошибка Left side cannot be assigned to