首页 > 解决方案 > 在 Indy TIdHTTPServer AuthRealm 中使用 Unicode 字符

问题描述

如何在事件处理程序的TIdHTTPResponseInfo.AuthRealm属性中使用 Unicode 字符?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;

图片


好的,我使用以下代码为 TIdHTTPResponseInfo.OnConnect 编写了事件处理程序:

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

不幸的是,它没有在响应标头处提供所需的文本处理。

图片

标签: delphipascalindy

解决方案


目前,根据 RFC 2617 1中使用的 RFC 2616的定义,TIdHTTPServer不原生支持HTTP 标头中的非 ASCII 字符,对于标头的realm参数尤其如此。WWW-Authenticatequoted-string

TIdHTTP1:Indy 在任何时候或TIdHTTPServer此时都没有实现 RFC 7230..7235 或 7617 。

话虽如此,当 Indy 写入和读取字符串时,它使用IOHandler的默认字符串编码(除非调用者指定不同),这是IndyTextEncoding_ASCII默认的。在服务器OnConnect事件中,您可以将AContext.Connection.IOHandler.DefStringEncoding属性设置为IndyTextEncoding_UTF8,然后TIdHTTPServer将 HTTP 标头写入和读取为 UTF-8 而不是 ASCII。

尽管 RFC 7235 和7617并没有正式允许 UTF-8realm.使用。许多(但不是全部!)网络浏览器在. 但是,为了尽可能广泛地兼容,在IETF 正式定义允许使用 UTF-8 并且所有 Web 浏览器都实现它之前,您应该坚持在 中仅使用 ASCII 字符。quoted-stringrealmrealm


推荐阅读