在Indy TIdHTTPServer AuthRealm中使用Unicode字符

时间:2019-02-27 15:58:28

标签: delphi pascal indy

如何在TIdHTTPResponseInfo.AuthRealm事件处理程序的TIdHTTPServer.OnCommandGet属性中使用Unicode字符?

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 :(得分:3)

此时,TIdHTTPServer在本地不支持HTTP标头中的非ASCII字符,对于{{1}的realm参数来说尤其如此}标头,按照RFC 2617 1 中使用的RFC 2616的WWW-Authenticate定义。

1:Indy目前未在quoted-stringTIdHTTP中实现RFC 7230..7235或7617。

也就是说,当Indy读写字符串时,它将使用TIdHTTPServer的默认字符串编码(除非调用者另行指定),默认情况下为IOHandler。在服务器的IndyTextEncoding_ASCII事件中,可以将OnConnect属性设置为AContext.Connection.IOHandler.DefStringEncoding,然后IndyTextEncoding_UTF8会将HTTP标头作为UTF-8而不是ASCII写入和读取。 / p>

尽管RFC 7235和7617并未正式允许TIdHTTPServer中的UTF-8,但它们确实使用了RFC 7230中realm的定义,该定义允许最多0xFF的八位字节(RFC 2616定义没有),这让我认为可以使用UTF-8 。许多(但不是全部!)网络浏览器的确在quoted-string中支持UTF-8。但是,为了获得最大的兼容性,您应该坚持在realm中仅使用ASCII字符,直到IETF正式定义允许使用UTF-8并且所有Web浏览器都实现它为止。