mORMot2 Daily每日上游提交速读

代理路由趋于稳定,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 子类。

版本号2.4.17433 → 2.4.17462
提交27
行数+1070 -395
阅读2 分钟

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-changed
  • GetSystemProxyUri(TUri, RawUtf8, RawUtf8, TUri)added

Arnaud Bouchez · 13:01 UTC · 在 GitHub 上查看该提交 →

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 的直连或代理路由。

公开 API

  • THttpClientSocket proxy routingbehaviour-changed

Arnaud Bouchez · 13:11 UTC · 在 GitHub 上查看该提交 →

3 高 有效代理路由变化时,重定向现在会重新连接 THttpClientSocket 提取 SameTunnelForUri 并纳入 SameOpenOptions。若重定向目标解析为不同的直连或代理路由,现在会关闭并重开连接;HTTP_SCHEME 也接受通过字段赋值构造的 usUndefined record。 修复 mormot.net.client+1 1b254474+24-15

net: some other proxy fixes

影响

重定向不再复用连接到错误代理路径的 socket,避免把请求发送给不兼容的 peer 或 tunnel。

公开 API

  • HTTP_SCHEMEbehaviour-changed

Arnaud Bouchez · 14:16 UTC · 在 GitHub 上查看该提交 →

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 转型失败或缺失派生类状态。

公开 API

  • THttpClientWebSockets.WebSocketsConnect legacy overloadsbehaviour-changed

Arnaud · 20:50 UTC · 在 GitHub 上查看该提交 →

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。

公开 API

  • TCrtSocket.ReOpenbehaviour-changed
  • TCrtSocket.OpenFrombehaviour-changed

Arnaud Bouchez · 15:44 UTC · 在 GitHub 上查看该提交 →

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,使用默认端口的代理路由也不易被误判为不同目标。

公开 API

  • TUri.FromBufferbehaviour-changed

Arnaud Bouchez · 16:25 UTC · 在 GitHub 上查看该提交 →

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 的凭据变化现在会强制更新路由状态,不再复用使用旧凭据认证的连接。

公开 API

  • THttpClientWebSockets.WebSocketsConnect(TUri, ...)signature-changed

Arnaud Bouchez · 16:04 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 08:40 UTC · 在 GitHub 上查看该提交 →

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, ...)added
  • THttpClientWebSockets.WebSocketsConnect(RawUtf8, TWebSocketProtocol, PHttpRequestExtendedOptions, ...)added

Arnaud Bouchez · 15:06 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 19:17 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 12:18 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 12:04 UTC · 在 GitHub 上查看该提交 →

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-changed
  • THttpClientSocket proxy bypassbehaviour-changed

Arnaud Bouchez · 11:47 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 12:22 UTC · 在 GitHub 上查看该提交 →

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-changed
  • TUri.ServerPortsignature-changed

Arnaud Bouchez · 12:48 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 09:59 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 09:44 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 11:38 UTC · 在 GitHub 上查看该提交 →

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

Arnaud Bouchez · 08:41 UTC · 在 GitHub 上查看该提交 →

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_TEXTadded
  • SCHEME_PORTadded

Arnaud Bouchez · 16:37 UTC · 在 GitHub 上查看该提交 →

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-changed
  • WS_SCHEMEadded

Arnaud Bouchez · 15:05 UTC · 在 GitHub 上查看该提交 →

22 低 JSON 测试与 HTTP 行解析进行了无功能变化的清理 RemoveMagicFromJson 测试复用预先计算的 magic 字符串,扫描注释标明 SSE2 路径,THttpRequestContext.ProcessParseLine 将布尔表达式展开为显式分支。 内部重构 mormot.core.json+2 e0b8347f+29-30

core: some code cleaning with no functional change

影响

应用代码与运行时行为均无变化;该提交只提升代码清晰度并减少重复测试准备。

Arnaud Bouchez · 19:24 UTC · 在 GitHub 上查看该提交 →

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 完成发生竞态,失败时会在限定时间内报告而非无限挂起。

Arnaud Bouchez · 07:41 UTC · 在 GitHub 上查看该提交 →

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 行为。

Arnaud Bouchez · 19:18 UTC · 在 GitHub 上查看该提交 →

25 低 数据库测试中的预期失败不再污染异常日志 外部数据库 next-ID 失败测试与 SQLite batch rollback 测试现在用 TSynLog.Family.ExceptionIgnoreCurrentThread 包围预期错误,并在 finally 中恢复设置。 测试 test.orm.extdb+1 d0efb516+26-15

test: hide expected exceptions

影响

数据库运行时行为不变;测试输出更安静,同时保留相同的失败与 rollback 断言。

Arnaud Bouchez · 09:22 UTC · 在 GitHub 上查看该提交 →

26 低 7-Zip 错误密码测试不再记录预期异常 TTestCoreCompression._7Zip 在检查错误压缩包密码的预期失败时临时设置 TSynLog.Family.ExceptionIgnoreCurrentThread,并在 finally 中恢复。 测试 test.core.data bfa4dec9+10-5

test: hide expected exception in TTestCoreCompression._7Zip

影响

生产压缩行为不变;自动化测试日志中的预期异常噪声更少。

Arnaud Bouchez · 10:00 UTC · 在 GitHub 上查看该提交 →

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 失败。

Arnaud Bouchez · 09:44 UTC · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13