delphi - 在 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;
不幸的是,它没有在响应标头处提供所需的文本处理。
解决方案
目前,根据 RFC 2617 1中使用的 RFC 2616的定义,TIdHTTPServer
不原生支持HTTP 标头中的非 ASCII 字符,对于标头的realm
参数尤其如此。WWW-Authenticate
quoted-string
TIdHTTP
1: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-8在realm
.使用。许多(但不是全部!)网络浏览器在. 但是,为了尽可能广泛地兼容,在IETF 正式定义允许使用 UTF-8 并且所有 Web 浏览器都实现它之前,您应该坚持在 中仅使用 ASCII 字符。quoted-string
realm
realm
推荐阅读
- node.js - Node.js 应用程序停止在谷歌云 vm 中运行
- c++ - 断言该类型是无符号整数或具有最大大小的枚举类型
- laravel - 无法识别的请求 URL (GET: /v1/customers/)。如果您尝试列出对象,请删除尾部斜杠
- java - com.google.ar.core.exceptions.NotYetAvailableException on frame.acquireCameraImage()
- node.js - 运行命令以使用 AndroidJS 构建应用程序时出错
- python - 构建 FastAPI 项目的最佳实践是什么?
- javascript - 自定义颜色选择器,没有任何反应包
- powerbi - PowerBI Jira 票据仪表板
- java - 如何重构这样的嵌套 if 语句?
- javalite - 如何从 JavaLite.io activeweb 控制器返回原始响应