立即处理可能影响正在运行的系统
代理路由趋于稳定,WebSocket 子类陷阱得到修复
本期扩展了 socket 与 REST 客户端的代理发现和绕过处理,并修复了重定向路由、代理凭据、socket 层及 URI 校验。还新增了支持 options 的 WebSocket factory,最终 build 修复了旧 overload 返回错误派生类型的回归。直接调用 GetProxyForUri 的代码现在必须传入 TUri,而不是 RawUtf8。
要点
- GetProxyForUri 现在接收 TUri 而非 RawUtf8,直接调用处需要源码迁移。
- HTTP_PROXY、HTTPS_PROXY、NO_PROXY、Windows bypass list 与 REST ProxyName 现在都会参与 socket 客户端路由选择。
- 跨源重定向、代理凭据变化和非 TCP 重连现在会选择正确的路由与 socket 层。
- 新的 THttpClientWebSockets.WebSocketsConnect overload 支持 TUri 与 THttpRequestExtendedOptions;build 2.4.17462 修复了旧 overload 的派生类 dispatch。
- RemoveMagicFromJson 会移除 JSON 字符串前缀中的 JSON_BASE64_MAGIC,而不改动普通字符串。
- 请落到 build 2.4.17462,不要停留在 2.4.17450 至 2.4.17461。
升级建议
请采用最终 build 2.4.17462。build 2.4.17450–2.4.17461 处于 TUri、代理和 WebSocket 迁移阶段,尚未包含后续的重定向、socket 层、凭据、parser 与子类修复。编译前请搜索直接调用 GetProxyForUri 的位置,把 RawUtf8 参数改为解析后的 TUri;随后测试代理绕过、认证代理、跨源重定向及 WebSocket 子类。
27 条中的 27 条 · 上游 27 次提交
1
高
GetProxyForUri 现在要求传入已解析的 TUri
公共 GetProxyForUri 参数从 RawUtf8 改为 TUri。新增 GetSystemProxyUri(TUri, proxy, bypass, temp) overload,同时保留 GetSystemProxyUri 的 RawUtf8 兼容 wrapper。
破坏性变更
mormot.net.client+1
fb71148d+90-83
net: favor TUri input for proxy calculation
影响
直接调用 GetProxyForUri('https://...') 的代码在 Delphi 或 FPC 下不再编译。内部调用避免重复解析,并用同一个规范化 URI 决定代理与 bypass。
需要迁移
搜索 GetProxyForUri 调用,用 TUri.From 把文本解析为 TUri,再把该 record 传给 GetProxyForUri。
公开 API
GetProxyForUrisignature-changedGetSystemProxyUri(TUri, RawUtf8, RawUtf8, TUri)added
2
高
socket 客户端在跨源重定向后会重新计算 bypass 与代理状态
THttpClientSocket 新增 SetTunnelForUri 与 SameTunnelForUri。OpenOptions 使用配置的 ProxyByPass 列表,SameOpenOptions 比较有效路由,跨源重连在 OpenBind 前重新计算 Tunnel。
修复
mormot.net.client
162838d7+28-17
net: fixed THttpClientSocket proxy support
影响
代理 bypass 规则现在作用于初始 socket 连接,重定向到另一 origin 时也不会继续使用首个 origin 的直连或代理路由。
建议升级
请重新测试 ProxyByPass 与跨源重定向行为,并采用最终 build,不要停在该中间版本。
公开 API
THttpClientSocket proxy routingbehaviour-changed
3
高
有效代理路由变化时,重定向现在会重新连接
THttpClientSocket 提取 SameTunnelForUri 并纳入 SameOpenOptions。若重定向目标解析为不同的直连或代理路由,现在会关闭并重开连接;HTTP_SCHEME 也接受通过字段赋值构造的 usUndefined record。
修复
mormot.net.client+1
1b254474+24-15
net: some other proxy fixes
影响
重定向不再复用连接到错误代理路径的 socket,避免把请求发送给不兼容的 peer 或 tunnel。
建议升级
使用代理的客户端应升级,并测试直连、bypass 与代理 origin 之间的重定向。
公开 API
HTTP_SCHEMEbehaviour-changed
4
高
旧 WebSocket factory 现在会保留请求的派生客户端类
THttpClientWebSockets.LegacyWebSocketsConnect 现在是 protected class function,并通过当前类调用 WebSocketsConnect。TPrivateRelay.NewServerClient 在调用 TServerClient.WebSocketsConnect 后使用 as 转型。
修复
mormot.net.relay+1
754f9f1f+13-9
net: fixed THttpClientWebSockets.WebSocketsConnect legacy overloads
影响
在 THttpClientWebSockets 派生类上调用旧 overload 时,现在会构造该派生类。build 2.4.17454–2.4.17461 可能返回父类,导致 relay 转型失败或缺失派生类状态。
建议升级
若在 TServerClient 等子类上调用旧 WebSocketsConnect overload,请使用 build 2.4.17462 或更新版本。
公开 API
THttpClientWebSockets.WebSocketsConnect legacy overloadsbehaviour-changed
5
高
重连会保留 socket 层,重定向拒绝非 HTTP scheme
THttpClientSocket retry 以及 TCrtSocket.ConnectUri、ReOpen、OpenFrom 现在会把已保存的 TNetLayer 传给 OpenBind。重定向会拒绝解析后不属于 HTTP_SCHEME 的 Location。
修复
mormot.net.client+1
ba80a667+15-7
net: fixed OpenBind() socket layer usage
影响
UDP 与 Unix-domain socket 不再静默地按 TCP 重开,HTTP 重定向也不能把客户端切换到不支持的 scheme。
建议升级
复用 UDP 或 Unix-domain TCrtSocket 的项目应优先升级,并测试非 HTTP Location 的拒绝行为。
公开 API
TCrtSocket.ReOpenbehaviour-changedTCrtSocket.OpenFrombehaviour-changed
6
中
损坏的 URI authority 会被拒绝,代理端口比较保持一致
TUri.FromBuffer 遇到空端口、仅空格端口或无效 authority 尾部时会清空 Server 并失败。THttpClientSocket.OpenBind 在比较目标与代理 tunnel 时会补上 80 或 443。
修复
mormot.net.client+2
22cf7d7d+102-22
net: enhanced TUri parser
影响
无效 endpoint 文本不再留下部分可用的 TUri,使用默认端口的代理路由也不易被误判为不同目标。
建议升级
若 URI 文本来自配置或重定向,请采用最终 build,并重新测试显式及默认代理端口。
公开 API
TUri.FromBufferbehaviour-changed
7
中
代理复用现在考虑凭据,并可返回 WebSocket 错误
THttpClientSocket.SameTunnelForUri 除 server、port 与 TLS 外还比较代理 User 和 Password。TCrtSocket.OpenBind 会清空 fProxyUrl 并比较完整 tunnel;TUri 版 WebSocketsConnect 新增可选 aErrorMessage 输出。
修复
mormot.net.client+3
7b276456+23-12
net: another set of proxy fixes
影响
同一代理 endpoint 的凭据变化现在会强制更新路由状态,不再复用使用旧凭据认证的连接。
建议升级
使用认证代理的项目应采用最终 build,并测试凭据轮换及 WebSocket 连接失败。
公开 API
THttpClientWebSockets.WebSocketsConnect(TUri, ...)signature-changed
8
中
异步连接析构会明确强制终止未完成写入
当 fWr 为空时,TPollAsyncConnection.Destroy 会禁用 SO_LINGER 以正常关闭;若用户态写 buffer 仍有数据,则设置零 linger,立即 reset 并丢弃数据。
修复
mormot.net.async
ab20d3ec+6-3
net: tuned TPollAsyncConnection closure
影响
连接销毁不再在仍有未发送 buffer 时进行含糊关闭;无法完成发送时 peer 会收到强制关闭,已完成写入仍使用正常异步关闭。
公开 API
TPollAsyncConnection.Destroybehaviour-changed
9
中
WebSocket 客户端新增支持 URI 与 options 的连接 factory
THttpClientWebSockets 新增 TUri 加 THttpRequestExtendedOptions,以及 URI 文本加 options 指针的 WebSocketsConnect overload。原有 host/port 与 URI overload 通过 legacy helper 保留。
新功能
mormot.net.ws.client
04fdbef9+86-29
net: new THttpClientWebSockets.WebSocketsConnect overloads
影响
WebSocket 连接现在可与 HTTP 客户端共享代理、bypass、TLS 和 timeout 配置。不要停在该引入 build,因为 legacy 子类 dispatch 直到 build 2.4.17462 才修复。
公开 API
THttpClientWebSockets.WebSocketsConnect(TUri, var THttpRequestExtendedOptions, ...)addedTHttpClientWebSockets.WebSocketsConnect(RawUtf8, TWebSocketProtocol, PHttpRequestExtendedOptions, ...)added
10
中
现在可从序列化文本中移除 JSON BLOB magic 前缀
mormot.core.json 新增 RemoveMagicFromJson(var RawUtf8)。它扫描带引号的 JSON 字符串,移除开头的 UTF-8 JSON_BASE64_MAGIC 标记,对唯一字符串原地压缩,并在修改共享字符串前复制。
新功能
mormot.core.json
e82e1227+76-2
core: new RemoveMagicFromJson() function
影响
应用可在不重新解析文档的情况下,把带 mORMot BLOB 标记的 JSON 转换为普通 base64 JSON;除非主动调用该函数,现有序列化行为不变。
公开 API
RemoveMagicFromJsonadded
11
中
NO_PROXY 域名与 IP 匹配成为可复用公共 helper
mormot.net.client 新增 NoProxyMatch,支持逗号分隔规则、可选开头点、精确 host、子域、IPv4/IPv6 literal 与单独 wildcard,并配有回归测试。
新功能
mormot.net.client+1
530cb3f0+71-7
net: new NoProxyMatch() parsing function
影响
应用与 HTTP 客户端可共享一致的 NO_PROXY 语义,无需重复实现域名后缀匹配。
公开 API
NoProxyMatchadded
12
中
WinHTTP 代理发现会应用系统 bypass list
GetWinProxyForUri 封装 WinHttpGetProxyInfo,转换 URL 与 Bypass 字段,并在 ProxyByPassMatch 匹配 URI host 时清除代理。WinHTTP 安全错误格式也得到简化。
新功能
mormot.lib.winhttp+1
fa71c244+40-17
net: enhanced WinHttp API support for GetProxyForUri()
影响
使用系统自动代理发现的 Windows 客户端现在会直连 Internet Options bypass list 中的目标。
公开 API
GetWinProxyForUriadded
13
中
socket 代理选择新增显式 bypass list 支持
GetSystemProxyUri 新增 bypass 参数,在选择强制、全局或自动发现代理前排除匹配 host。THttpClientSocket 会把 THttpRequestExtendedOptions.ProxyByPass 传入该决策。
新功能
mormot.net.client
0e03d2c8+17-12
net: ProxyByPass support for THttpClientSocket
影响
基于 socket 的 HTTP 客户端现在可遵循 Windows 风格 bypass mask,不再把所有非本地目标都送经代理。
公开 API
GetSystemProxyUrisignature-changedTHttpClientSocket proxy bypassbehaviour-changed
14
中
socket 代理发现现在在 Windows 与 POSIX 上遵循 NO_PROXY
GetProxyForUri 在选择 HTTP_PROXY 或 HTTPS_PROXY 后读取 NO_PROXY;若 NoProxyMatch 匹配已解析 host,则清除代理。该路径同时用于 Windows 与 POSIX。
新功能
mormot.net.client+1
2e0bdd2b+22-4
net: NO_PROXY env variable support for GetProxyForUri()
影响
已设置 NO_PROXY 的环境现在会让匹配目标直连,而不再经过配置代理;网络可达性会按环境变量的预期发生变化。
值得一看
检查部署环境中的 NO_PROXY 值,并测试所需内部 host 绕过代理、外部 host 仍使用代理。
公开 API
GetProxyForUribehaviour-changed
15
中
TUri 可把 WebSocket scheme 规范化为 HTTP 以进行代理查找
TUri.URI 与 TUri.ServerPort 新增可选 NormalizeToHttp 参数。设为 true 时,ws 与 wss record 输出为 http 与 https,同时保留 server、port 和 address。
新功能
mormot.net.sock
6e58a86c+10-9
net: new NormalizeToHttp optional parameter to TUri.ServerPort/Uri methods
影响
代理 API 可为 WebSocket endpoint 查询 HTTP 代理配置,同时普通 TUri 输出仍保留原 scheme。默认 false 保持现有调用兼容。
公开 API
TUri.URIsignature-changedTUri.ServerPortsignature-changed
16
中
REST socket 客户端现在会保留显式代理设置
TRestHttpClientSocket.InternalOpen 仅在 Proxy 为空时把 THttpRequestExtendedOptions.Proxy 设为 'none'。因此构造器传入的 ProxyName 与 ProxyByPass 会到达 THttpClientSocket.OpenOptions。
新功能
mormot.rest.http.client
1f291195+5-5
rest: ProxyName support for TRestHttpClientSocket
影响
REST socket 客户端首次可使用显式代理;已经传入这些曾被忽略参数的部署现在会改变网络路由。
值得一看
若 TRestHttpClientSocket 构造器已传入 ProxyName 或 ProxyByPass,请在 staging 验证现在生效的路由与认证。
公开 API
TRestHttpClientSocket proxy parametersbehaviour-changed
17
低
PeerCache 自动选择会忽略非活动接口
未指定接口名时,THttpPeerCacheSettings.GuessInterface 会加入 mafUpOnly,并报告未找到本地活动接口。显式命名的接口仍允许处于 down 状态。
修复
mormot.net.server
2afaac27+8-8
net: automatic PeerCache selection require an "up" interface
影响
PeerCache 自动启动不再选择断开的网卡并生成不可用地址;显式接口选择保持原行为。
公开 API
THttpPeerCacheSettings.GuessInterfacebehaviour-changed
18
低
Windows 风格代理 bypass mask 新增专用 matcher
mormot.net.client 新增 ProxyByPassMatch,用于分号分隔、忽略大小写的 host mask,并实现 wildcard 与无点名称的 Windows <local> 规则。
新功能
mormot.net.client
d916140c+82-2
net: new ProxyByPassMatch() parsing function
影响
应用及后续 socket 客户端代码可评估与 Windows 代理设置一致的 bypass 语法。
公开 API
ProxyByPassMatchadded
19
低
Tunnel 测试会报告连接状态并提供 flag 文本
mormot.net.tunnel 新增 ToText(TTunnelLocalFlags)。TunnelSocket 测试发送失败时会记录 thread、processing、flags、本地与远端端口;mormot.net.sock 也补充了 SetLinger 各取值范围的文档。
新功能
mormot.net.sock+2
fbcc175f+41-11
test: added more context to Tunnel coverage
影响
生产 Tunnel 行为不变;失败日志包含更多诊断状态,应用也可复用新的 flag formatter。
公开 API
ToText(TTunnelLocalFlags)added
20
低
URI scheme 名称与默认端口成为公共常量
mormot.net.sock 公开 SCHEME_TEXT 与 SCHEME_PORT,并在 TUri 中替换原有私有查找数组。同一提交还移除重复的 fProxyAuthHeader 重置并扩充损坏端口测试。
新功能
mormot.net.client+2
7dddd3ec+25-15
net: published SCHEME_TEXT/SCHEME_PORT constants
影响
应用代码可复用 mORMot 的标准 scheme 文本与端口映射;该提交本身不改变其他 URI 行为。
公开 API
SCHEME_TEXTaddedSCHEME_PORTadded
21
低
TUri.FromScheme 可在一次调用中初始化资源地址
TUri.FromScheme 新增可选 aAddress 参数,移除一个开头 slash 后存入 Address。公共 WS_SCHEME 数组把 TLS 布尔值映射到 usWs 或 usWss。
新功能
mormot.net.sock
9dcadeec+12-4
net: enhanced TUri.FromScheme()
影响
调用方可直接构造完整的 WebSocket 或 HTTP TUri,无需单独赋值 Address;默认参数保持现有调用源码兼容。
公开 API
TUri.FromSchemesignature-changedWS_SCHEMEadded
22
低
JSON 测试与 HTTP 行解析进行了无功能变化的清理
RemoveMagicFromJson 测试复用预先计算的 magic 字符串,扫描注释标明 SSE2 路径,THttpRequestContext.ProcessParseLine 将布尔表达式展开为显式分支。
内部重构
mormot.core.json+2
e0b8347f+29-30
core: some code cleaning with no functional change
影响
应用代码与运行时行为均无变化;该提交只提升代码清晰度并减少重复测试准备。
23
低
异步 WebSocket broadcast 测试会等待 upgrade 完成
TNetworkProtocols.DoTWebSocketAsyncServer 用基于 RunTask 的对象替代专用 broadcast thread,并加入 Connected、Done 事件、OnWebSocketConnect callback 与每次 broadcast 的有界等待。
测试
test.net.proto
836d5fff+109-47
test: rewritten TNetworkProtocols.DoTWebSocketAsyncServer
影响
生产代码不变;回归测试不再与 WebSocket upgrade 完成发生竞态,失败时会在限定时间内报告而非无限挂起。
24
低
JSON magic 移除新增 copy-on-write 与损坏输入测试
TTestCoreProcess.EncodeDecodeJSON 现在覆盖 RemoveMagicFromJson 的普通、转义、共享、空值、属性名、重复标记及损坏 JSON 输入,并验证原地复用 buffer。
测试
test.core.data
cd184a55+90-2
test: cover the new RemoveMagicFromJson()
影响
生产代码未改变;测试明确了标记边界并保护 RawUtf8 的 copy-on-write 行为。
25
低
数据库测试中的预期失败不再污染异常日志
外部数据库 next-ID 失败测试与 SQLite batch rollback 测试现在用 TSynLog.Family.ExceptionIgnoreCurrentThread 包围预期错误,并在 finally 中恢复设置。
测试
test.orm.extdb+1
d0efb516+26-15
test: hide expected exceptions
影响
数据库运行时行为不变;测试输出更安静,同时保留相同的失败与 rollback 断言。
26
低
7-Zip 错误密码测试不再记录预期异常
TTestCoreCompression._7Zip 在检查错误压缩包密码的预期失败时临时设置 TSynLog.Family.ExceptionIgnoreCurrentThread,并在 finally 中恢复。
测试
test.core.data
bfa4dec9+10-5
test: hide expected exception in TTestCoreCompression._7Zip
影响
生产压缩行为不变;自动化测试日志中的预期异常噪声更少。
27
低
没有可用网络时,PeerCache 测试会干净跳过
TNetworkProtocols._THttpPeerCache 在创建 hook 前调用 THttpPeerCacheSettings.GuessInterface;若没有本地活动接口,则输出原因并退出。
测试
test.net.proto
a78c76d9+10-3
test: cleanly skip PeerCache tests if there is no network available
影响
生产代码不变;离线 CI 与开发机不再因缺少网络而报告 PeerCache 失败。