Как подключить устройство с помощью idHTTP - PullRequest
0 голосов
/ 12 июня 2018

У меня есть какое-то устройство, которое работает с протоколом HTTP.

Сообщение о соединении должно быть таким:

GET /cgi/proc/sound?1000&1000 HTTP/1.1
Host: 10.0.1.2
User-Agent: test
Authorization: Digest username="admin", realm="HTROM", nonce="5d6553aca400536fcd1dca1d467bc428", uri="/cgi/proc/sound?1000&1000", algorithm=MD5, response="7053664025903c9c1485a188023909bd", opaque="3115FB22", qop=auth, nc=00000001, cnonce="63d86b75894ca977"*

Мой код выглядит следующим образом:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  with idHTTP do begin
    HTTPOptions := HTTPOptions + [hoInProcessAuth];
    Request.BasicAuthentication := False;
    HandleRedirects := True;
    Request.URL := '/cgi/proc/sound?1000&1000';
    Request.UserAgent := 'test';
  end;
  //add result to memo
  meInfo.Text := idHTTP.Get('http://10.0.1.2'); 
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  idHTTP.Free;
end;    

procedure TMainForm.IdHTTPAuthorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
  Authentication.Username := 'admin';
  Authentication.Password := '555555';
  if Authentication is TIdDigestAuthentication then
  begin
    with Authentication.AuthParams do begin
      AddValue('realm', 'HTROM');
      AddValue('nonce', '527b004c29df30afd42c9dbf43dcb6d9');
      AddValue('algorithm', 'MD5');
      AddValue('response', '3f4f49f5adefafdf19ce9148103486af');
      AddValue('opaque', '60DB81DD');
      AddValue('qop', 'auth');
      AddValue('nc', '00000001');
      AddValue('cnonce', '669bcf2a9b1c9deb');
    end;
    TIdDigestAuthentication(IdHTTP.Request.Authentication).Uri := IdHTTP.Request.URL;
    TIdDigestAuthentication(Authentication).Method := 'GET';
    showmessage('onAuthorization: ' + Authentication.Authentication);
  end;
  Handled := True;
end;

Я получаю сообщение об ошибке

HTTP / 1.1 400 Неправильный запрос

1 Ответ

0 голосов
/ 12 июня 2018

Вы неправильно запрашиваете URL.Вам нужно передать complete URL на TIdHTTP.Get(), не использовать свойство TIdHTTP.Request.URL, например:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  with idHTTP do
  begin
    HTTPOptions := HTTPOptions + [hoInProcessAuth];
    Request.BasicAuthentication := False;
    HandleRedirects := True;
    Request.UserAgent := 'test';
  end;
  //add result to memo
  meInfo.Text := idHTTP.Get('http://10.0.1.2/cgi/proc/sound?1000&1000');
end;

Кроме того, в событии OnAuthorization вам не нужночтобы заполнить свойства дайджеста AuthParams, Uri или Method вручную.TIdDigestAuthentication заполняет AuthParams при получении запроса на аутентификацию от сервера, а TIdHTTP заполняет свойства Uri и Method при отправке аутентификации на сервер.

Просто укажите Username и Password, это все, что вам нужно, например:

procedure TMainForm.IdHTTPAuthorization(Sender: TObject; Authentication: TIdAuthentication; var Handled: Boolean);
begin
  Authentication.Username := 'admin';
  Authentication.Password := '555555';
  Handled := True;
end;
...