Первое что в глаза бросилось, это ссылка, начинается с "http". Хм.. Или и так работать должно?
Также рекомендуют не путать х32 и х64 версии Open SSL Indy.
Эээ... где 'http'? У меня везде 'http
s' указано, он мне и нужен.
По поводу х32-х64 версий - ну, это, какбэ, само собой... Хотя, я во всех вариациях попробовал, в первом посте под спойлером можете посмотреть результаты попыток - со старыми версиями openssl, с новыми, со специально-индийскими, 32, 64, на разных ПК, ОСях, делфях...
Порой на изучение всяких Delphi-компонент уходит гораздо больше времени, чем изучить матчасть напрямую. Касаемо данной проблемы - получить код https-страницы легко решается использованием, к примеру, стандартного WinHTTP, который хорошо описан в MSDN.
Спасибо за указание направления, благодаря Вашей подсказке задачу решил. Получилось как-то так:
procedure TForm1.Button1Click(Sender: TObject);
const
S_WIN_INET_ERROR = 'Îøèáêà ïîäêëþ÷åíèÿ';
var
Site: PAnsiChar;
PagePath: PAnsiChar;
PageText: String;
Internet: HINTERNET;
Session: HINTERNET;
Request: HINTERNET;
CountToRead: Cardinal;
CountReaded: Cardinal;
begin
//www.cbr.ru
Site := PAnsiChar(edtSite.Text);
//currency_base/dynamics.aspx?VAL_NM_RQ=R01010&date_req1=21.10.2016&date_req2=28.10.2016&rt=1&mode=1
PagePath := PAnsiChar(edtPagePath.Text);
Memo1.Clear;
try
begin
Internet := InternetOpen('{164E3C3E-E4AF-4AE8-8644-CCBFEFC9ABD1}',
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Internet = nil then raise Exception.Create(S_WIN_INET_ERROR);
Session := InternetConnect(Internet, Site, INTERNET_DEFAULT_HTTP_PORT {INTERNET_DEFAULT_HTTPS_PORT},
nil, nil, INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0);
if Session = nil then
raise Exception.Create(S_WIN_INET_ERROR);
Request := HttpOpenRequest(Session, 'GET', PagePath, nil, nil, nil,
INTERNET_FLAG_RELOAD {or INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS} {or INTERNET_FLAG_SECURE}, 0);
if Request = nil then
raise Exception.Create(S_WIN_INET_ERROR);
if not HttpSendRequest(Request, '', 0, nil, 0) then
raise Exception.Create(S_WIN_INET_ERROR);
while InternetQueryDataAvailable(Request, CountToRead, 0, 0) and (CountToRead > 0) do
begin
SetLength(PageText, CountToRead);
InternetReadFile(Request, @PageText[1], CountToRead, CountReaded);
Memo1.Text := Memo1.Text + PageText;
end;
end;
finally
begin
if Request <> nil then InternetCloseHandle(Request);
if Session <> nil then InternetCloseHandle(Session);
if Internet <> nil then InternetCloseHandle(Internet);
end;
end;
end;
В заключение несколько вопросов по WinInet можно?
1) Я ведь получаю страницу с https-сайта, стало быть, мне нужно использовать https-порт. Но если указать в InternetConnect() порт 443 - INTERNET_DEFAULT_HTTPS_PORT - то сервер отвечает '400 Bad Request, The plain HTTP request was sent to HTTPS port'. А если указывать 80 - INTERNET_DEFAULT_HTTP_PORT - то все работает как ожидается... Почему же тогда у меня порты наоборот? Сайт, на самом деле, доступен на 443 порту, а на 80 - нет, там все честно.
2) В функции HttpOpenRequest() флаг INTERNET_FLAG_SECURE - должен, вроде бы, запускать работу SSL. Но если его добавить - приложение отправить реквест не может. А без него - отправляет, вполне себе хорошо.
3) В функции HttpOpenRequest() флаг INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS - как именно его интерпретировать? MSDN: 'Disables detection of this special type of redirect. When this flag is used, WinINet transparently allow redirects from HTTP to HTTPS URLs.' Так если флаг выставлять - он "ignore" перенаправление в каком смысле - что он его "disables" (выключает и пофиг все) или он его "allow" (разрешает перенаправлять все подряд)?
ЗЫ: Основываясь на собственных вопросах - а правда, может, сайт SSL не использует, а просто придуряется?