如何在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;
好的,我用以下代码编写了TIdHTTPResponseInfo.OnConnect的事件处理程序:
procedure TMainForm.HttpServerConnect(Context: TIdContext);
begin
Context.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8
end;
不幸的是,它没有在响应头处提供所需的文本处理。
答案 0 :(得分:3)
此时,TIdHTTPServer
在本地不支持HTTP标头中的非ASCII字符,对于{{1}的realm
参数来说尤其如此}标头,按照RFC 2617 1 中使用的RFC 2616的WWW-Authenticate
定义。
1:Indy目前未在quoted-string
或TIdHTTP
中实现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浏览器都实现它为止。