立即处理可能影响正在运行的系统
HTTP 状态机趋于稳定,Unix 客户端关闭不再删除服务端 socket
本期集中于网络:完成大规模 HTTP 客户端与超时重构,并修复其间暴露的构造器、代理、WebSocket 和原生后端回归。HTTP 请求 framing 现在区分 HEAD 响应语义与请求体;Windows HTTP.sys 支持 chunked 上传及重复认证或 cookie header;POSIX 客户端关闭时也不再删除 Unix-domain 服务端 socket。
要点
- POSIX Unix-domain clients no longer unlink the server socket path when they close.
- HTTP.sys now accepts chunked request bodies and preserves repeated Set-Cookie and authentication headers.
- HEAD and OPTIONS handling now follows message framing; redirected 301 POST and 303 requests also discard their old bodies.
- THttpRequestExtendedOptions.GetTimeouts is replaced by ComputeTimeouts, THttpRequest.InternalConnect loses its parameters, and TCrtSocket.ReOpen no longer accepts a timeout.
- TRestHttpClientGeneric connection-definition parsing no longer risks an infinite loop.
- Land on final build 2.4.17433 rather than an intermediate build from this refactor sequence.
升级建议
请落到最终 build 2.4.17433,不要停在本期中间 build:后续提交修复了构造器调用、超时 setter、代理选择、REST 定义解析、重定向请求体和 HTTP 服务端状态。POSIX Unix socket 部署与 Windows HTTP.sys 服务端应优先升级。编译前请搜索 THttpRequestExtendedOptions.GetTimeouts、带参数的 THttpRequest.InternalConnect override 以及 TCrtSocket.ReOpen(timeout)。
36 条中的 36 条 · 上游 37 次提交
1
严重
HTTP 选项复用不再越界读取认证 record
THttpClientSocket.SameOpenOptions 向 THttpRequestExtendedOptions.SameAuth 传入 @aOptions,而非 @aOptions.Auth,使其获得预期的基址并消除错误内存访问。
修复
mormot.net.client
b466ee53+3-3
net: fixed wrong memory access in THttpClientSocket.SameOpenOptions
影响
Delphi/FPC HTTP 客户端复用检查不再读取无关内存,可避免认证比较错误与潜在 access violation。
建议升级
不要部署紧邻此前的中间 build;请在 2.4.17433 上重新测试带认证的 keep-alive 连接复用。
2
高
Socket 超时存储简化,ReOpen 移除参数
TCrtSocket 用具体的连接、发送与接收值取代 fallback 字段,跟踪已应用的 SO_*TIMEO,通过 SetTimeoutsFrom 复制设置,并把 ReOpen(aTimeout) 改为使用已存储值的无参 ReOpen。
破坏性变更
mormot.net.sock
7f8a625b+114-155
net: rewritten TCrtSocket timeouts implementation
影响
向 ReOpen 传超时参数的代码将无法编译。Delphi/FPC 应在调用 ReOpen 前设置 ConnectTimeout、SendTimeout 与 ReceiveTimeout;写入 TimeOut 现在会同时设置三者。
需要迁移
将 ReOpen(timeout) 改为先赋值超时属性再调用 ReOpen,并重新测试 accepted socket 与代理/TLS 重连。
公开 API
TCrtSocket.ReOpensignature-changed — 超时参数被移除,改用已存储的阶段超时。TCrtSocket.SetTimeoutsFromaddedTCrtSocket.TimeOutbehaviour-changed — 写入该属性现在会设置全部三个阶段超时。
3
高
扩展 HTTP 选项现在会计算具体超时值
THttpRequestExtendedOptions.GetTimeouts 被移除,ComputeTimeouts 会把缺失的阶段值写成 HTTP 默认值或 CreateTimeoutMS。THttpClientSocket 将其复制到 TCrtSocket,连接复用也不再比较超时配置。
破坏性变更
mormot.net.client
3d81851d+42-45
net: fixed THttpClientSocket timeouts usage
影响
直接调用 GetTimeouts 的 Delphi/FPC 代码将无法编译,必须改用会修改 record 的 ComputeTimeouts。仅变更超时值不再强制 HTTP socket 重连。
需要迁移
把 GetTimeouts 调用替换为 ComputeTimeouts,然后从 record 读取 ConnectTimeoutMS、SendTimeoutMS 与 ReceiveTimeoutMS。
公开 API
THttpRequestExtendedOptions.GetTimeoutsremovedTHttpRequestExtendedOptions.ComputeTimeoutsadded
4
高
HTTP 后端 override 现在从实例读取连接选项
THttpRequest.InternalConnect 移除三个超时参数;WinHTTP、WinINet、Curl 与 Delphi NetHTTP override 改从 fExtendedOptions 读取。构造过程先初始化 URI 字段与选项,再调用无参虚方法。
破坏性变更
mormot.net.client
edbd697a+39-43
net: rewritten THttpRequest.InternalConnect method
影响
自定义 THttpRequest 后代若 override InternalConnect,将在 Delphi/FPC 下编译失败,需更新 override 签名与超时读取方式。
需要迁移
将 override 改为 procedure InternalConnect;,并读取 fExtendedOptions.ConnectTimeoutMS、SendTimeoutMS 与 ReceiveTimeoutMS。
公开 API
THttpRequest.InternalConnectsignature-changed
5
高
重定向与 100-Continue 现在正确处理请求体
当 301 POST 或适用的 303 转成 GET 时,THttpClientSocket 会清除 Data、DataMimeType 与 InStream;有输入 stream 时会生成 header;服务端仅在 Content-Length 或 chunked framing 声明 body 时发送 100 Continue。
修复
mormot.net.async+2
bdb952f3+27-23
net: some client/server HTTP state machine fixes
影响
Delphi/FPC 重定向请求不再把旧实体数据随重写后的 GET 发送;服务端也不会在没有 body framing 时要求客户端传 body。
建议升级
重新测试流式上传、POST-to-GET 重定向、303 处理与 Expect: 100-Continue 客户端。
6
高
REST 连接定义解析不再无限循环
TRestHttpClientGeneric.RegisteredClassCreateFrom 用 UrlDecodeNextNameValue 取代多段 UrlDecode 调用;每个 name/value 对都会推进一次,再处理已识别选项。
修复
mormot.crypt.secure+1
9292c506+27-20
rest: fixed TRestHttpClientGeneric.RegisteredClassCreateFrom
影响
由 TSynConnectionDefinition 创建的 Delphi 与 FPC 客户端,不会再因 DatabaseName 中某些旧逻辑无法推进的选项而挂起。
建议升级
重新测试持久化 REST 连接定义,包括未知与 URI 编码选项。
7
高
OPTIONS 可携带内容,只有 HEAD 不返回响应体
HTTP 客户端与服务端代码用显式 IsHead 判断响应体,并用 message framing 判断请求体。Curl 不再为 OPTIONS 启用 CURLOPT_NOBODY。
修复
mormot.net.acme+3
f119fd8c+18-19
net: only HEAD has no body - OPTIONS could
影响
Delphi/FPC 服务端现在会读取有 framing 的 OPTIONS 请求体,客户端也可接收 OPTIONS 响应内容。此前假定 OPTIONS 无 body 的应用可能看到新数据。
建议升级
测试带请求体/响应体的 OPTIONS endpoint,以及 HEAD 响应和带 framing 的 HEAD 请求。
8
高
Curl 请求选项正确重置并恢复 TLS 验证
TCurlHttp 始终根据 RedirectMax 设置 coFollowLocation;未忽略证书错误时显式恢复 coSSLVerifyPeer 与 coSSLVerifyHost,再应用客户端证书或自定义 CA 文件。
修复
mormot.net.client
cf40c09d+19-15
net: several fixes to TCurlHttp options usage
影响
复用的 Curl handle 不再残留上一请求的重定向或宽松 TLS 状态。POSIX Delphi/FPC Curl 客户端会恢复配置的证书验证。
建议升级
重新测试在同一 Curl 客户端上交替使用重定向与 TLS 验证设置的请求。
9
高
批量超时更新现在会调用子类 setter
TCrtSocket.SetTimeouts 恢复为公开 helper:设置 ConnectTimeout,并调用虚方法 SetSendTimeout 与 SetReceiveTimeout。SetTimeoutsFrom 和 DoCreate 也走此路径,确保 WebSocket override 执行。
修复
mormot.net.client+1
93002192+18-16
net: fixed TCrtSocket virtual timeout setters call
影响
通过基类 helper 分配超时时,THttpClientWebSockets 现在会同步 CallbackAnswerTimeOutMS。Delphi/FPC 子类的 setter hook 重新生效。
建议升级
重新测试通过 TimeOut、SetTimeouts 与复制 socket 选项改变 WebSocket callback 超时。
10
高
HTTP 服务端会读取任何有 framing 的请求体,包括 HEAD
同步与异步服务端路径现在根据 Content-Length 或 Transfer-Encoding 状态触发 body streaming 与 DownloadBody,不再排除 HEAD。异步 100-Continue 处理仅限等待请求体的状态。
修复
mormot.net.async+1
0e0af8c7+14-19
net: fixed body retrieval on HTTP servers logic
影响
有 framing 的请求字节会被一致消费,即使方法为 HEAD,也可避免 keep-alive 连接协议错位。Delphi 与 FPC 服务端后端均受益。
建议升级
在 keep-alive 与 OnBodyDownload 回归测试中加入带 framing 的 HEAD 请求。
11
高
关闭 Unix-domain 客户端不再删除服务端 socket
TCrtSocket.Close 现在仅在 nlUnix 且设置 fWasBind 时调用 fpunlink。回归测试连接到已 bind 的路径,并验证只有释放服务端才会删除文件。
修复
mormot.net.sock+1
5b58dd54+19-2
net: TCrtSocket.Close only deletes a unix socket file it bound itself
影响
在 POSIX Delphi 与 FPC 上,客户端断开不会再因删除 filesystem entry 而使仍运行的 Unix-domain 服务端无法接受新连接。
建议升级
Unix-domain socket 用户应优先升级,并测试频繁客户端连接后绑定路径仍存在。
公开 API
TCrtSocket.Closebehaviour-changed
12
高
WinINet 将超时应用到 session handle
TWinINet.InternalConnect 改在 fSession 上调用 InternetSetOption,而不是尚未创建的 fConnection;连接、发送或接收超时配置失败时会抛出明确错误。
修复
mormot.net.client
94043c0a+11-8
net: fixed TWinINet.InternalConnect timeouts setting
影响
Windows WinINet 客户端现在会真正获得配置的阶段超时,而不是用 nil handle 静默调用 API。配置失败对 Delphi 调用者可见。
建议升级
验证 WinINet 后端的连接、上传与响应超时行为。
13
高
HTTP 构造现在会在字段就绪后调用后端
THttpRequest.DoInternalConnect 在选择默认端口前设置 fHttps,并在计算选项后恢复遗漏的 InternalConnect 调用。
修复
mormot.net.client
9482ca12+4-3
net: fixed previous THttpRequest commit
影响
HTTPS 恢复默认端口 443,原生 HTTP 后端也会真正打开 session。本提交修复了上一构造器重构在 Delphi/FPC 中的问题。
建议升级
跳过 build 2.4.17413,并在重新测试 HTTP/HTTPS 构造器后使用最终 build。
14
高
HTTP.sys 服务端现可接收 chunked 请求体
THttpApiServer.DoExecute 现在区分已知 Content-Length 与 transfer-encoded 输入;chunked 数据通过可复用 128 KB buffer 循环读取,同时执行 MaximumAllowedContentLength 并记录实际接收字节数。
新功能
mormot.lib.winhttp+1
7baf2887+77-54
net: let http.sys server support chunked input body
影响
Windows HTTP.sys 后端可接受 HTTP/1.1 chunked 上传,不再拒绝或截断。未知长度且超限的 body 返回 413,接收错误返回 406。
建议升级
围绕 MaximumAllowedContentLength 测试 chunked 上传,并确认应用限制与 413 处理。
15
高
各 HTTP 后端构造器统一初始化路径
THttpRequest 新增 DoInternalConnect,在调用后端虚方法前初始化 URI 字段、user agent 与具体超时;Curl 用发送/接收中较大值作为全局传输超时,Delphi NetHTTP 读取统一代理选项。
内部重构
mormot.net.client
70951dd7+28-29
net: several fixes to THttpRequest.Create
影响
所有原生后端统一走一条配置路径,但这个中间重构需要下一提交恢复后端调用并修正 HTTPS 端口选择。
值得一看
16
中
Socket 接收对每次尝试应用超时
TCrtSocket.TrySockRecv 为每次 Recv 调用计算 deadline,在 SockInPending 期间强制零等待,并在 select/poll 前钳制剩余值。
修复
mormot.net.sock
0f8d2fcd+15-13
net: rewritten TCrtSocket.TrySockRecv timeout logic
影响
Delphi/FPC 接收等待按底层尝试遵循 ReceiveTimeout,pending buffer 探测仍保持非阻塞。
值得一看
17
中
HTTP 重定向仅在规定情形转为 GET,其余保留方法
TAcmeLetsEncryptServer 对 GET/HEAD 使用 301,其余使用 308。THttpClientSocket 仅把 301 的 POST 与 303 的非 HEAD 方法转为 GET;构造请求时也不再丢弃显式提供的 HEAD body。
修复
mormot.net.acme+2
8a6da8b7+14-12
net: other HTTP HEAD support related fixes
影响
Delphi/FPC 客户端在 301 中保留 PUT、DELETE 等方法,并按 303 规则处理;ACME 的 HTTP-to-HTTPS 重定向用 308 保留非 GET 方法。
值得一看
18
中
Socket 发送使用每次尝试的单调时钟 deadline
TCrtSocket.TrySndLow 为每次 Send 尝试用 GetTickCount64 计算 deadline,并将剩余 fSendTimeout 传给 WaitFor,不再使用旧全局 TimeOut。
修复
mormot.net.sock
b05f8522+12-8
net: rewritten TCrtSocket.TrySndLow timeout/wait logic
影响
Delphi/FPC 的阻塞发送会更精确遵守发送阶段超时,不会在 Send 已耗时后重新等待完整时长。
值得一看
19
中
Pending buffer 读取取消等待但不修改 socket 超时
TCrtSocket 在 InputSock 周围新增内部 fSockInPending 标志;SockInRead 与 TrySockRecv 用它跳过重试等待,同时保持 SO_RCVTIMEO 与 fReceiveTimeout 不变。
修复
mormot.net.sock
057aff56+7-9
net: fixed TCrtSocket.SockInPending from InputSock()
影响
SockInPending 保持非阻塞,同时不再临时破坏逻辑接收超时,提高 Delphi/FPC buffered socket 的一致性。
值得一看
20
中
WebSocket 初始化移至共享 socket hook
THttpClientWebSockets 用 DoCreate 取代构造器 override,调用 inherited DoCreate、初始化设置,并从 fReceiveTimeout 得到 CallbackAnswerTimeOutMS。
修复
mormot.net.ws.client
7ceaa39c+6-8
net: fixed THttpClientWebSockets constructor
影响
Delphi/FPC 的每个继承构造器现在都通过虚 hook 恰好初始化一次 WebSocket 设置,避免遗漏或重复初始化。
值得一看
21
中
Curl 可显式禁用继承的代理设置
当 THttpRequestExtendedOptions.Proxy 为 'none' 时,TCurlHttp 向 CURLOPT_PROXY 传入非 nil 空字符串;空选项仍允许 Curl 环境默认值,实际值则选择指定代理。
修复
mormot.net.client
68b62f05+8-5
net: fixed TCurlHttp proper 'none' proxy support
影响
POSIX Curl 请求可可靠绕过 HTTP_PROXY 等环境设置。Delphi/FPC 调用者继续使用文档中的 'none' 值。
值得一看
22
中
WinINet 使用 Unicode user-agent 与代理值
TWinINet.InternalConnect 将 user agent、代理和绕过列表从 RawUtf8 转为 SynUnicode,并用 InternetOpenW 取代 InternetOpenA。
修复
mormot.net.client
3851e090+8-5
net: fixed TWinINet Unicode options support
影响
Windows Delphi 客户端会保留非 ASCII user-agent 与代理配置,不再经过当前 ANSI code page。FPC 非 Windows 路径不受影响。
值得一看
23
中
Windows Basic Kerberos 认证使用完整服务端上下文
TBasicAuthServerKerberos 将单次 onlypass 凭据捷径限制为 POSIX GSSAPI;Windows 改走 SSPI 与可选组 SID 检查所需的 ServerSspiAuth context 路径。
修复
mormot.net.ldap+1
8fc28980+7-6
net: fixed TBasicAuthServerKerberos on Windows
影响
Windows Delphi 服务端在 Basic Kerberos 密码验证时不再走仅适用于 GSSAPI 的捷径。POSIX FPC 行为保持不变。
建议升级
重新测试 Windows Basic Kerberos 登录,包括配置与未配置组 SID 限制的情形。
24
中
系统代理选择现在检查目标主机
GetSystemProxyUri 在判断空目标、loopback 或纯 IPv4 目标不走代理时,改用 TUri.Server 而非 Address。
修复
mormot.net.client+1
d8e97dc6+5-6
net: fixed GetSystemProxyUri()
影响
HTTP 客户端不再根据 URL path 做代理决策。Delphi/FPC 上 localhost 与配置为直连的 IPv4 流量应按预期绕过代理。
建议升级
在启用自动代理发现时重新测试 localhost、字面 IPv4 与普通 hostname 请求。
25
中
ACME GET 重定向改用 301 而非 308
TAcmeLetsEncryptServer.Redirect 将 GET 与 HEAD 一同放入 301 Moved Permanently 分支,其他方法继续使用保留方法的 308。
修复
mormot.net.acme
9cd6ccba+5-4
net: fixed GET redirection on TAcmeLetsEncryptServer
影响
浏览器与 ACME 的标准 GET 流量会收到常规永久重定向。现有 Delphi/FPC 应用代码无需修改。
26
中
HTTP.sys 保留多个独立认证 challenge
HTTP_RESPONSE.AddCustomHeader 现在像处理 Set-Cookie 与 Connection 一样处理 WWW-Authenticate 和 Proxy-Authenticate:每次出现都作为 unknown header 输出,不再合并到单个 known-header slot。
修复
mormot.lib.winhttp
37898a45+6-3
net: http.sys respWwwAuthenticate + respProxyAuthenticate multiple headers
影响
Windows HTTP.sys 响应可同时声明多种认证 scheme,不再静默丢失后续值。Delphi/FPC 调用代码无需修改。
值得一看
27
中
HTTP.sys 保留每个 Set-Cookie header
HTTP_RESPONSE.AddCustomHeader 将 respSetCookie 放入 unknown-header 数组,使多个 Set-Cookie 行得以保留,不再在单一 known-header 字段中互相覆盖。
修复
mormot.lib.winhttp
ed828cab+5-4
net: fixed several respSetCookie / Set-Cookie: values in http.sys
影响
Windows HTTP.sys 应用在单个响应中设置多个 cookie 时,现在会全部发送。其他 Delphi/FPC HTTP 服务端后端不受影响。
建议升级
重新测试会输出多个 Set-Cookie 行的登录与会话响应。
28
中
WebSocket callback 等待跟随有效接收超时
THttpClientWebSockets 通过 DoCreate 初始化;SetReceiveTimeout 在 inherited setter 后,从已存储的 fReceiveTimeout 设置 CallbackAnswerTimeOutMS。
修复
mormot.net.ws.client
881d1c4e+4-4
net: fixed THttpClientWebSockets with new timeouts
影响
Delphi/FPC 客户端的 WebSocket callback 等待现在与归一化后的有效接收超时一致。
值得一看
29
中
代理绕过列表可在选项序列化后保留
THttpRequestExtendedOptions.Save 以键 pb 保存 ProxyByPass,Load 会与现有代理、认证、TLS 和超时字段一同恢复。
修复
mormot.net.client
ac6bc5d6+5-2
net: fixed THttpRequestExtendedOptions.ProxyByPass serialization
影响
持久化 HTTP 连接选项的 Delphi/FPC 代码,重新加载后不再丢失代理绕过列表。缺少新键的旧数据仍可读取。
值得一看
30
中
扩展 HTTP 选项新增代理绕过列表
THttpRequestExtendedOptions 新增公开 ProxyByPass,THttpRequest 移除重复存储;WinHTTP、WinINet 与 Curl 的代理读取统一通过 options record。
新功能
mormot.net.client
2febb8e3+19-19
net: introducing THttpRequestExtendedOptions.ProxyBypass field
影响
使用扩展 options 构造器的 Delphi/FPC 调用者现在可直接提供原生代理绕过列表。现有构造参数仍保留。
值得一看
公开 API
THttpRequestExtendedOptions.ProxyByPassadded
31
中
HTTP.sys chunked 上传按几何方式扩展 buffer
chunked body 路径会直接保存首块,后续块复制前用 NextGrow 扩展 InContent,不再每次接收都 append 并重分配字符串。
性能
mormot.net.server
c8d7648a+11-5
net: optimized memory allocation for http.sys #637 chunked input body
影响
Windows HTTP.sys 上大型或碎片化 chunked 上传会减少内存分配与复制。Delphi/FPC 应用接口不变。
32
中
含义模糊的无 body 方法 helper 已弃用
HttpMethodWithNoBody 被标记为 deprecated;文档要求响应体判断使用 IsHead,请求体存在与否则依据 message framing。
弃用
mormot.net.http
a65a05fa+6-8
net: marked HttpMethodWithNoBody() as deprecated
影响
Delphi/FPC 调用者会收到弃用警告。继续使用该 helper 可能保留 OPTIONS 无 body 的错误假设。
值得一看
公开 API
HttpMethodWithNoBodydeprecated
33
中
REST HTTP 客户端采用统一超时 record
TRestHttpClientGeneric 将连接、发送与接收值写入 fExtendedOptions,并在构造器和定义加载中调用 ComputeTimeouts;代理字符串保持 RawUtf8,不再经过 ANSI 转换。
内部重构
mormot.rest.http.client
f54c3e10+17-37
rest: rewritten TRestHttpClient with latest changes
影响
REST HTTP 客户端与原生客户端共享相同超时默认值,并保留非 ASCII 代理文本。Delphi/FPC 公开构造语法不变。
值得一看
34
中
REST HTTP 客户端仅在扩展选项中保存代理数据
TRestHttpClientRequest 移除重复的 fProxyName 与 fProxyByPass 字段,从 fExtendedOptions 序列化值,并通过 TUri 加 options 的重载构造 THttpRequest。
内部重构
mormot.rest.http.client
bdfe38d5+16-14
rest: removed TRestHttpClientRequest fProxyName/fProxyPass fields
影响
Delphi/FPC REST 客户端的代理设置现在只有一个数据源。现有公开构造器与连接定义接口保持不变。
值得一看
35
低
异步连接遵循配置的 loopback 地址策略
TAsyncConnection.Create 与 Recycle 将 RemoteIPLocalHostAsVoidInServers 传给 TNetAddr.IP,不再总把 loopback 转为空 RemoteIP。
修复
mormot.net.async+1
16543664+7-7
net: TAsynConnection follow RemoteIPLocalHostAsVoidInServers
影响
全局策略为 false 时,Delphi/FPC 异步服务端现在可报告 127.0.0.1,与同步服务端一致。无需代码迁移。
36
低
方法测试现在覆盖 HTTP 代码实际使用的 predicate
test.core.base 移除 HttpMethodWithNoBody 断言,并为 IsGet、IsPost、IsPut、IsDelete、IsHead 与 IsOptions 增加明确的正反例。
测试
test.core.base
a166d116+31-15
tests: remove HttpMethodWithNoBody() but use really used methods
影响
这只是方法语义变更的测试覆盖,本提交本身不改变 Delphi/FPC 应用代码。