Перейти к содержанию
Fire Monkey от А до Я
  • 0

NetHTTPClient и SSL


Rusland

Вопрос

Так как не получается работать с 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
Ссылка на комментарий

Рекомендуемые сообщения

  • 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
    

    Удачи!

Изменено пользователем Сысоев Максим
Ссылка на комментарий
  • 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

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

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

Ссылка на комментарий
  • 0
В 14.05.2016 в 21:54, krapotkin сказал:

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

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

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

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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...