• 0
Rusland

NetHTTPClient и SSL

Вопросы

Так как не получается работать с IdHTTP в сервисе, решил попробовать компонент NetHTTPClient. Бросил NetHTTPClient1 на форму.
Хочу открыть адрес https://ya.ru
В папку \Win32\Debug положил libeay32.dll и ssleay32.dll (они рабочие, проверены с IdHTTP)
 
Код (пока тестирую на обычном приложении, а не в сервисе):

function TFormMain.GetResponse(aURL: string): String;
var 
  Ss: TStringStream; 
begin 
  with NetHTTPClient1 do 
  begin 
    AllowCookies:=true; 
    try 
      Ss:=TStringStream.Create('', TEncoding.UTF8); 
      Get(aURL,ss); 
      Result:=Ss.DataString; 
    finally FreeAndNil(Ss); end; 
  end; 
end;
 
procedure TFormMain.NetHTTPClient1ValidateServerCertificate(
  const Sender: TObject; const ARequest: TURLRequest;
  const [Ref] Certificate: TCertificate; var Accepted: Boolean);
begin
  Accepted:=true;
end;


procedure TFormMain.BtnSendClick(Sender: TObject);
var
  Response:String;
const
  aURL='https://ya.ru';
begin
  TTask.Run(procedure
    begin
    try
      Response:=GetResponse(aURL); // отправляю Get запрос
      TThread.Synchronize(nil, procedure
      begin
        Memo.Lines.Add(Response);
      end);
    finally end;
  end);
end;

Получаю access violation в System.Net.HTTPClient в строке 1965 

if (Result.Value.Chars[0] = '"') and (Result.Value[High(Result.Value)] = '"') then

видимо из-за того что Result.Value пустой. 
А если попробовать открыть https://mail.ru такого не происходит и страница нормально скачивается.
 
В чем проблема?

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 ответов на этот вопрос

  • 1

Ну тут ошибка разрабов.

  • Копируешь файл  System.Net.HttpClient в папку с проектом (правишь оригинал)
  • Открываешь его на строке с твоей ошибкой(у меня это 1965 строка)
  • Перед ней добавляешь строку:
    if Result.Value.Length>0 then
    

    То есть у тебя получится так(1964-1966 строка):

     Result.Value := Values[0].Substring(Pos + 1).Trim;
      if Result.Value.Length>0 then
      if (Result.Value.Chars[0] = '"') and (Result.Value[High(Result.Value)] = '"') then
    

    Удачи!

Изменено пользователем Сысоев Максим

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

По-моему для работы этого компонента не нужно складывать рядом libeay32.dll и ssleay32.dll, всё уже встроено должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Сысоев Максим, спасибо, проблема с https://ya.ru решилась.

 

Сейчас пытаюсь подключится через NetHTTPClient к локальному серверу с авторизацией (через IdHTTP кстати работает), но тут нарываюсь на ошибку в System.Net.URLClient.pas в строке 859

  if PosScheme = -1 then                                            
    raise ENetURIException.CreateResFmt(@SNetUriInvalid, [AURIStr]);

в какой-то момент AURIStr становиться пустым (уже в DecomposeURI она приходит пустая) и вылезает сообщение 

Project Test.exe raised exception class ENetHTTPClientException with message 'Invalid URL: ""'.

 

Все, решил проблему. Это была моя ошибка с авторизацией.

Вообще крайне мало информации по этому компоненты. Если кто-то решит использовать этот компонент, то прочтите здесь (фактически единственный источник информации).

 

 
 

По-моему для работы этого компонента не нужно складывать рядом libeay32.dll и ssleay32.dll, всё уже встроено должно быть.

 

Вы правы, dll-ки не нужны

 

 

 

 

PS. Кстати, кто-нибудь подскажет как узнать код ответа (200, 404 итп) при использовании NetHTTPClient?

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

PS. Кстати, кто-нибудь подскажет как узнать код ответа (200, 404 итп) при использовании NetHTTPClient?

 

Очень легко.

 

var
    Response: IHTTPResponse;
  begin
     Response := FHTTPClient.Post(CONST_URL, Params, Stream);
     AnswerCode := Response.StatusCode; // вот этот код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Можно ли как-то задавать timeout для NetHTTPClient?

Если можно, то какой максимальный таймаут на чтение? (не на коннект)

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Hey Rusland I'm also getting the ENetHTTPClientException with message 'Invalid URL: ""'. error, I do not know how to fix it, how did you fix it?

Изменено пользователем Tyler Durden

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

таймауты у них только в берлине запилили

до этого рекомендовали запускать поток, оттуда второй поток с HTTPClient и первый поток прибивает второй, если нет ответа Timeout миллисекунд и выходит сам...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 14.05.2016 в 21:54, krapotkin сказал:

таймауты у них только в берлине запилили

до этого рекомендовали запускать поток, оттуда второй поток с HTTPClient и первый поток прибивает второй, если нет ответа Timeout миллисекунд и выходит сам...

То-то я заметил ConnectionTimeout и ResponseTimeout и удивлялся что раньше не видел... хм... значит они только появились

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Mars M
      Есть такой вот код для работы с гугл переводчиком:
      procedure TfrmMain.GTranslate; var Data: TStringList; S: String; begin IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6'; Data := TStringList.Create; try Data.Text := ('client=x'#13#10 + 'text=' + Edit1.Text + #13#10 + 'hl=en'#13#10 + 'sl=en'#13#10 + 'tl=ru'); try S := (IdHTTP1.Post('http://translate.google.ru/translate_a/t', Data)); except on E: exception do ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message); end; finally Data.Free; end; end; Работает без проблем.
      Переделал его для NetHttpClient, практически один в один и вместо перевода получаю html страницу с гугл капчей.
      Типа такой как получаю если заходить через браузер http://translate.google.ru/translate_a/t?client=x&text=Hello&hl=en&sl=en&tl=ru
      Так в чем между ними разница что получаю разный результат?
      PS: Просто я в проекте и так использую NetHttpClient, хотелось бы на нем и сделать а не плодить кучу однотипных компонентов.
    • От long_island
      Всем привет. Встал вопрос после обновления MacOS до High Sierra. Ранее для работы приложения через https из коробки работал Indy в RAD Studio 10.0. После обновления MacOS стала появляться ошибка о невозможности подгрузить библиотеку OpenSSL. Понял, что в обновленной MacOS теперь используется LibreSSL и из коробки теперь не работает. Перерыл тонну материала, но вопрос остался не решенным. Надеюсь, что кто - то имеет какие - то догадки в этом направлении.
    • От bossalex
      Недавно компилил приложение на Delphi  FMX Android  при обращении  к серверу https при выполнении Get запроса от компонента TIdHttp запросил библиотеку "Could not load SSL library" используется протокол sslvTLSv1_2 в windows все пашет в андроид нет , накопал что можно подключить библиотеки  libssl.so и  libcrypto.so через  deployment .assets\internal , А вот как в коде дальше их использовать никто примерчик не выложил, хоть и обсуждали на интернет просторах 100 раз, те как прикрутить  к IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile. Если есть у кого код выложите пожалуйста? или скинте по email bossalex@ya.ru
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method.sslvTLSv1_2;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode.sslmUnassigned;
       
    • От Sashar333
      Здравствуйте! Вопрос такой:
      Есть процедура:
      Если переменные inn,capcha и capchaToken указаны правильно то Idhttp работает как надо, если inn или capcha не верны то прим Idhttp.post программа выдает ошибку:

      а хочется получить данные как в анализаторе:

      Как можно это сделать? 
    • От Anasazi
      Всем доброго времени суток. Возникла необходимость решить такую задачу: в таблице базы MySQL хранится список изображений и их URL. Необходимо получить этот список массивом. Затем загрузить изображения и поочередно с интервалом показать их в TImage.
      Понимаю, что получить список изображений правильнее при помощи PHP скрипта, но в каком виде скрип должен вернуть данные, чтобы в Delphi получить из них массив не знаю.
      Раньше для получения изображений использовал такую процедуру. Но вопрос, где хранить изображения перед демонстрацией их в TImage? Создавать несколько MemoryStream?
      procedure LoadWebImage(url: string; image: TBitmap);
      var
        idhttp : TNetHTTPClient;
        ms : TMemoryStream;
      begin
       IdHTTP := TNetHTTPClient.Create(nil);
        ms := TMemoryStream.Create;
        try
          idhttp.Get(url, ms);
          ms.Position := 0;
          image.LoadFromStream(ms);
        finally
          ms.Free;
          idhttp.Free;
        end;
      end;
    • От Кирилл
      Добрый день!
      Возникла необходимость из программы на Android отправлять запросы на web сервер и получать ответ.
      Пробую использовать TidHTTP:
      - кинул на форму компонент TidHTTP;
      - вызываю:  
      procedure TForm1.btSendClick(Sender: TObject); var list: TStringList; s: string; begin list := TStringList.Create; try list.Add('1'); try s := IdHTTP1.Post('http://127.0.0.1', list); ShowMessage(s); except on E: Exception do ShowMessage('Error: ' + E.Message); end; finally FreeAndNil(list); end; end; - в результате программа закрывается. Без всяких сообщений.
      Запускал на смартфоне Samsung Galaxy A3 (2016) Android 6.0.1.
      В чем может быть проблема?
       
       
       
       
       
       
    • От giveaway
      При написании кода под Windows я обычно использую WinNT, чтобы определить, выходит ли пользователь в Интернет через файрвол, а также для проверки сертификата сайта, когда клиент подключается к нему. Чем можно заменить WinNT под Firemonkey, чтобы выполнить эти задачи – проверку наличия файрвола и проверку сертификата сайта? Спасибо.
    • От ivadimos
      Пытаюсь опубликовать приложение в Гугл маркет.
      Присылают ответ на почту.

      OpenSSL
      The vulnerabilities were addressed in OpenSSL 1.02f/1.01r. To confirm your OpenSSL version, you can do a grep search for:
      $ unzip -p YourApp.apk | strings | grep "OpenSSL"
      You can find more information and next steps in this Google Help Center article.
      Но ведь я не использую никакой работы с сетью и т.д, только firedac и sqlite
    • От Rusland
      Как реализовать показ ProgressBar при загрузке фотографии на сервер? Интересует как именно определять сколько байт передано?
      Используется компонент NetHTTPClient.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу