Страница 1 из 1
[РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в потоке
Добавлено: 04.04.2018 15:16:57
yus
Добрый день.
Столкнулся с такой проблемой.
Имеется класс наследник от TThread в нем происходит обращение к https узлу.
В основном теле создаю несколько потоков в которых идет обращения на https узлы.
Когда поток один то все работает замечательно, когда запускаю одновременно несколько потоков то первый поток запускается успешно а в последующих возникает ошибка
Project project1 raised exception class 'EInOutError' with message:
Could not initialize OpenSSL library
Вот простейший код который воспроизводит эту ошибку.
Код: Выделить всё
program project1;
uses
unit1;
var
MYThread: array[0..2] of TMyHTTPRequest;
i: integer;
begin
for i := 0 to 2 do
begin
MYThread[i] := TMyHTTPRequest.Create(True);
MYThread[i].FreeOnTerminate := True;
MYThread[i].Start;
end;
ReadLn;
end.
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fphttpclient, sslsockets, fpopenssl;
type
{ TMyHTTPRequest }
TMyHTTPRequest = class(TThread)
public
procedure Execute; override;
end;
implementation
{ TMyHTTPRequest }
procedure TMyHTTPRequest.Execute;
var
Client: TFPHTTPClient;
res: string;
begin
Client := TFPHTTPClient.Create(nil);
res := Client.Get('https://google.com');
FreeAndNil(Client);
end;
end.
Что я делаю не так и как победить?
Спасибо.
Re: Ошибка SSL в TFPHTTPClient при работе в потоке
Добавлено: 04.04.2018 15:26:00
vitaly_l
yus писал(а):
for i := 0 to 2 do
begin
MYThread := TMyHTTPRequest.Create(True);
Вы создали MYThread и потом снова его создаёте.
Сделайте
var MYThread array [0..2] of TMyHTTPRequest;и потом создавайте
MYThread[i] := TMyHTTPRequest.Create(True);
Re: Ошибка SSL в TFPHTTPClient при работе в потоке
Добавлено: 04.04.2018 15:35:49
yus
vitaly_l писал(а):yus писал(а):
for i := 0 to 2 do
begin
MYThread := TMyHTTPRequest.Create(True);
Вы создали MYThread и потом снова его создаёте.
Сделайте
var MYThread array [0..2] of TMyHTTPRequest;и потом создавайте
MYThread[i] := TMyHTTPRequest.Create(True);
К сожалению это не решает проблему.
PS: подредактировал код
Re: Ошибка инициализации SSL в TFPHTTPClient при работе в по
Добавлено: 04.04.2018 18:09:58
Ichthyander
Да, странная ошибка. Использую многопоточное обращение по протоколу https, но таких проблем не наблюдал...
Добавлено спустя 8 минут 41 секунду:
Re: Ошибка инициализации SSL в TFPHTTPClient при работе в потоке
Можно было бы предположить, что у Вас не установлена библиотека или нет соответствующих DLL в папке, но первый поток, говорите, что без ошибокк. Это точно?
Re: Ошибка инициализации SSL в TFPHTTPClient при работе в по
Добавлено: 04.04.2018 18:20:00
yus
Если сделать цикл от 0 до 0 то происходит запуск одного потока и он прекрасно отрабатывает.
Re: Ошибка инициализации SSL в TFPHTTPClient при работе в по
Добавлено: 04.04.2018 18:49:03
pupsik
а если так:
Код: Выделить всё
program project1;
uses
unit1,
openssl;
.....
var
MYThread: array[0..2] of TMyHTTPRequest;
i: integer;
begin
InitSSLInterface;
Добавлено спустя 23 минуты 58 секунд:Re: Ошибка инициализации SSL в TFPHTTPClient при работе в потокеВ принципе:
такое
Код: Выделить всё
program project1;
uses
sysutils,
Unit1,
openssl,
Math,
fgl;
type
TMYThread = specialize TFPGList<TMyHTTPRequest>;
TURLTable = array[0..4] of string;
const
URLTable : TURLTable = (
'https://google.com.ru/',
'https://translate.google.com.ru/',
'https://sourceforge.net',
{ну а чё? :)}
'http://www.freepascal.ru/',
'https://lenta.ru/'
);
var
MYThread : TMYThread;
tmp_arr : TMyHTTPRequest;
i, z, arr_c : integer;
can_free : Boolean;
function GetUrl : string;
begin
result := URLTable[Random(High(URLTable))];
end;
begin
Randomize;
InitSSLInterface;
arr_c := 2;
Write('Count: ');
Read(arr_c);
MYThread := TMYThread.Create;
for i := 0 to arr_c - 1 do
begin
tmp_arr := TMyHTTPRequest.Create(true);
tmp_arr.URL := GetUrl;
MYThread.Add(tmp_arr);
MYThread.Items[i].Start;
end;
{не сильно верный вариант}
can_free := false;
While not can_free do
begin
z := 0;
for i := 0 to arr_c - 1 do
begin
if MYThread.Items[i].Active then
inc(z);
end;
if z = 0 then
can_free := true;
Sleep(2);
end;
MYThread.Clear;
FreeAndNil(MYThread);
WriteLn('End works');
end.
плюс такое
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes,
SysUtils,
fphttpclient;
type
{ TMyHTTPRequest }
TMyHTTPRequest = class(TThread)
private
Client : TFPHTTPClient;
fsteam : TMemoryStream;
f_url : string;
f_active : Boolean;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended : boolean);
destructor Destroy; override;
property URL : string write f_url;
property Active : Boolean read f_active;
end;
implementation
{ TMyHTTPRequest }
constructor TMyHTTPRequest.Create(CreateSuspended: boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
Client := TFPHTTPClient.Create(nil);
fsteam := TMemoryStream.Create;
With Client do
begin
HTTPversion := '1.1';
end;
f_active := true;
end;
procedure TMyHTTPRequest.Execute;
begin
try
try
Client.HTTPMethod('GET', f_url, fsteam, [200, 301, 302])
except
on e : Exception do
WriteLn(e.Message);
end;
finally
WriteLn(Client.ResponseStatusCode, ' from url ', f_url);
end;
f_active := false;
end;
destructor TMyHTTPRequest.Destroy;
begin
FreeAndNil(Client);
FreeAndNil(fsteam);
inherited Destroy;
end;
end.
шото там делает
Re: Ошибка инициализации SSL в TFPHTTPClient при работе в по
Добавлено: 05.04.2018 00:50:00
yus
pupsik писал(а):а если так:
Огромное спасибо мил человек

Вот решение!
Re: [РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в поток
Добавлено: 05.04.2018 09:34:40
Ichthyander
Теперь понятно, в моих приложениях вызывается модуль
ssl_openssl, то есть в разделе Uses обязательно идет ссылка на него. А вот в разделе инциализации этого модуля есть вот это.
Код: Выделить всё
{==============================================================================}
initialization
if InitSSLInterface then
SSLImplementation := TSSLOpenSSL;
В результате чего необязательно инициировать InitSSLInterface
Добавлено спустя 2 минуты 9 секунд:Re: [РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в потокеХотя нет. Это же Synapse...
Добавлено спустя 8 минут 14 секунд:Re: [РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в потокеА те же приложения, что используют fphttpclient: так там вообще нет ни ссылок на ssl_openssl, ни ссылок на sslsockets и fpopenssl, как в примере кода топикстартера, и, странно, но все соединения по HTTPS прекрасно работают :/
Добавлено спустя 55 секунд:Re: [РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в потокеНо возможно дело в том, что это Debian и там OpenSSL автоматически подгружаются или типа того... Хотя в Windows 10 тоже работает прекрасно... Темный лес

Re: [РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в поток
Добавлено: 06.04.2018 11:08:05
wofs
Ichthyander
Использую fphttpclient и SSL. Все прекрасно работает. Ссылка на модуль OpenSSL есть в недрах fphttpclient.
Re: [РЕШЕНО]Ошибка инициализации SSL в TFPHTTPClient в поток
Добавлено: 06.04.2018 14:17:44
Ichthyander
wofs у меня тоже работает

Прочитайте еще раз. Я просто пытался понять, почему не работает у топикстартера без InitSSLInterface в многопоточном приложении.