gpt4 book ai didi

delphi - 在 Indy TIdHTTPServer AuthRealm 中使用 Unicode 字符

转载 作者:行者123 更新时间:2023-12-02 07:31:13 25 4
gpt4 key购买 nike

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

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

image

最佳答案

目前,TIdHTTPServer 本身不支持 HTTP header 中的非 ASCII 字符,对于 realm 参数尤其如此WWW-Authenticate header ,根据 RFC 2617 1 中使用的 RFC 2616 的 quoted-string 定义。

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

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

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

关于delphi - 在 Indy TIdHTTPServer AuthRealm 中使用 Unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54909542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com