Http Post Indy10 Ошибка Delphi 7: Ошибка создания контекста SSL - PullRequest
0 голосов
/ 21 марта 2019

Я использую Delphi 7 с Indy 10.6.2.5459, чтобы время от времени отправлять POST-запрос к серверу:

sParams := '?ultimaAlteracao='+FormatDateTime('YYYY-MM-DD',now())+'T00:00:00.000';
FidHTTP := TIdHTTP.Create;
try
  FidHTTP.Request.Clear;
  FidHTTP.Request.Accept           := 'application/json;charset=UTF-8';
  FidHTTP.Request.CharSet          := 'UTF-8';
  FidHTTP.Response.ContentType     := 'application/json;charset=UTF-8';
  FidHTTP.Response.ContentEncoding := 'UTF-8';
  FidHTTP.Request.CustomHeaders.AddValue('Authorization','Basic '+EncodeBase64('xx:xx@123456'));

  JsonStream := TStringStream.Create('');
  JsonStream.Position := 0;
  try
    FidHTTP.Get('https://'+server+'/LinxImportacaoArquivo/GetSelecaoDadosMDMNCM'+sParams, JsonStream);
    DataString := JsonStream.DataString;
  finally
    FreeAndNil(JsonStream);
  end;
finally
  FreeAndNil(FidHTTP);
end;

Через некоторое время он начинает давать сбой и возвращает:

Ошибка создания контекста SSL. Ошибка: 140A90F1: SSL подпрограммы: SSL_CTX_new: невозможно загрузить подпрограммы ssl2 md5

Если я перезапущу приложение, оно снова будет работать некоторое время. Я нашел людей, у которых была такая же проблема: здесь и здесь

Из того, что я узнал, это может быть какой-то другой процесс, который использует Indy для создания запроса, который мешает, и я цитирую

Кажется, это проблема с некоторым типом статического члена инициализация внутри библиотеки openssl. У меня есть 2 библиотеки, обе они используют библиотеку openssl, давайте назовем их A и B. Когда приложение запускается как A & B могут успешно создать контекст безопасности. Позже, когда библиотека B пытается создать другую контекст безопасности это не удается. И библиотека A, и B являются подключаемыми модулями наше приложение, так что они оба будут загружаться, но если один не нужен, это выгружен.

Действительно, в моем приложении выполняется множество других процессов, выполняющих http-запросы через indy10 или WinInet.

Итак, мой вопрос: есть ли какая-нибудь процедура, которую я могу вызвать на Indy10, чтобы она инициализировала что-то, что освободило ее в библиотеке opensll?

1 Ответ

0 голосов
/ 21 марта 2019

Я обнаружил, что в модуле IdSSLOpenSSL есть процедура с именем UnLoadOpenSSLLibrary.Если я всегда вызываю эту процедуру перед моим кодом, ошибка не возникает.

...