Используйте символы Юникода в Indy TIdHTTPServer AuthRealm - PullRequest
0 голосов
/ 27 февраля 2019

Как использовать символы Юникода в свойстве TIdHTTPResponseInfo.AuthRealm в обработчике событий TIdHTTPServer.OnCommandGet?

procedure TMainForm.HttpServerCommandGet(Context: TIdContext; RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
resourcestring
  DefaultPage =
  '<!DOCTYPE html>'                                               + sLineBreak +
  '<title>Embedded Web Server</title>'                            + sLineBreak +
  '<h1>Embedded Web Server</h1>'                                  + sLineBreak +
  '<p>Приветствие!'                                               + sLineBreak +
  '<br>Это веб-страница, которая отображается по умолчанию.</p>'  ;
begin
  if UserHandle = IdUserHandleNone then
    if not RequestInfo.AuthExists or (UserManager.AuthenticateUser(RequestInfo.AuthUsername, RequestInfo.AuthPassword, UserHandle) < 0) then
      begin
        ResponseInfo.AuthRealm := 'Аутентификация пользователя';
        ResponseInfo.ContentText := 'Несанкционированный доступ запрещен!';
        ResponseInfo.ContentType := 'text/plain; charset=utf-8';
        Exit
      end;
  if RequestInfo.Document = '/' then
    begin
      ResponseInfo.ContentText := DefaultPage;
      ResponseInfo.ContentType := 'text/html; charset=utf-8'
    end
end;

image


Хорошо, я написал обработчик событий для TIdHTTPResponseInfo.OnConnect со следующим кодом:

procedure TMainForm.HttpServerConnect(Context: TIdContext);
begin
  Context.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8
end;

К сожалению, он не обеспечил необходимую обработку текста в заголовках ответов.

image

1 Ответ

0 голосов
/ 27 февраля 2019

В настоящее время TIdHTTPServer изначально не не поддерживает символы не ASCII в заголовках HTTP, и это особенно верно для параметра realm заголовка WWW-Authenticate, согласно определениюquoted-string RFC 2616, который используется в RFC 2617 1 .

1: Indy не реализует RFC 7230..7235 или 7617 в TIdHTTP или TIdHTTPServer в это время.

Это, как говорится, когда Indyзаписывает и читает строки, он использует строковую кодировку IOHandler по умолчанию (если вызывающая сторона не указывает иное), которая по умолчанию составляет IndyTextEncoding_ASCII.В событии OnConnect на сервере вы можете установить для свойства AContext.Connection.IOHandler.DefStringEncoding значение IndyTextEncoding_UTF8, а затем TIdHTTPServer будет записывать и читать HTTP-заголовки как UTF-8 вместо ASCII.

Хотя RFCs 7235и 7617 формально не разрешают UTF-8 в realm, они действительно используют определение quoted-string из RFC 7230, которое допускает октеты до 0xFF (определение RFC 2616 нет), что заставляет меня думать, что UTF-8 можно использовать .И многие (но не все!) Веб-браузеры поддерживают UTF-8 в realm.Но для максимально возможной совместимости вы должны придерживаться только символов ASCII в realm, пока IETF формально не определит, что UTF-8 разрешено использовать, и все веб-браузеры реализуют его.

...