gpt4 book ai didi

linux - Freepascal,Indy SVN 主干版本,PHP 客户端在传输 XML 时没有收到任何信息,直到删除编码转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:33 25 4
gpt4 key购买 nike

我编写了一个服务器守护进程(Linux、Ubuntu),它作为前端层与 PHP 通信。

最近,我将 FPC 和 Indy 库更新为 FPC 2.6.0,将 Indy 更新为主干版本(在我使用 Tiburon 分支之前)。

全部编译,一切看起来都很好,但是,当写入 IOHandler 时,没有收到任何东西(PHP 客户端),客户端将报告收到 0 个字节。

深入研究该问题后,我看到当使用 IOHandler 的写入方法时,编码在发送响应之前在 IdGlobal.pas 的 ToBytes() 方法中进行验证和转换。

现在,如果我注释掉 ToBytes() 例程中的转换行;

if ASrcEncoding <> ADestEncoding then begin
LBytes := TIdTextEncoding.Convert(ASrcEncoding, ADestEncoding, LBytes);

这一次,PHP 客户端收到响应。

我的问题是,如何配置我的 Indy tcp 服务器或 IOHandlers 以停止对数据进行编码?

最佳答案

当 Indy 认为两种编码不同时,Indy 会调用 TIdTextEncoding.Convert(),以便可以将字节从一种字符集转换为另一种字符集。然而,Indy 还没有检测到两个 TIdTextEncoding 对象何时表示相同的字符集,因此可以跳过转换。这主要是由于 Delphi 2009-XE 中 Embarcadero 的 SysUtils.TEncoding 类的限制,它不公开该信息(在 Delphi XE2 中,TEncoding 收到新的 EncodingNameCodePage 属性,但 Indy 尚未更新以使用它们)。 Indy 的 TIdTextEncoding 类是 Delphi 2009+ 中 TEncoding 的别名,仿照 Delphi 5-2007 和 FreePascal 中的 TEncoding,以便在整个 Indy 的代码页中维护单个 API。

Indy 目前只是将 TIdTextEncoding 对象指针相互比较,这在使用来自 TIdTextEncoding 类属性的标准编码时很好,因为它们在内存。但是,如果您混合通过 TIdTextEncoding.GetEncoding() 方法获得的 TIdTextEncoding 对象,例如来自 Indy 的 CharsetToEncoding() 函数,那么对象指针将不匹配,即使它们的字符集匹配。在理想情况下,这将是从字符集到 Unicode 的无操作转换,再返回到相同的字符集。

但是,在 FreePascal 下,TIdTextEncoding 使用了 ICONV 库,而 Indy 对 ICONV 的支持是不完整的。实现了转换,但尚未实现完整的错误处理,这主要是由于在不同平台上访问 errno 变量的问题,ICONV 使用该变量报告扩展错误。并非所有 ICONV 的错误都是致命的,但 Indy 尚无法检测到它们。

更糟糕的是,TEncoding 设置为在发生转换错误时不抛出异常,仅在发生缓冲区错误时抛出异常(Embarcadero 对此感到羞耻)。如果发生数据转换错误,TEncoding 只会返回空数据。我们必须在非 D2009+ 环境(如 FreePascal)下在 TIdTextEncoding 中保持该行为。我想 Indy 可以更新以在内部检查该条件并在需要时引发自己的异常。

要回答您的问题,您无法告诉 Indy 跳过对 TIdTextEncoding.Convert() 的调用。您必须暂时将其注释掉并重新编译 Indy。这是当前 Indy 版本中的一个已知问题,并且已经完成了一些工作来解决它,但是尚无 ETA 何时准备好供公众使用。在 Indy 11 中,我们可能会放弃对 TEncoding 的支持,并在 Indy 中原生实现我们自己的字符集引擎,至少对于常用的字符集是这样。这样我们就不再依赖于任何特定平台特定的 API。但我们甚至还没有开始 Indy 11 的工作,甚至还没有决定它的功能集是什么。

关于linux - Freepascal,Indy SVN 主干版本,PHP 客户端在传输 XML 时没有收到任何信息,直到删除编码转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9942700/

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