裸机 HTTP 协议与 QEMU 受控服务
NativeHttpProtocolTests.cs 直接编译内核 NativeWebTransport.cs 中的同一份有界 HTTP framing 代码。测试条件仅排除必须由 Cosmos runtime 执行的 socket/网卡部分,不使用同名假 Cosmos 包或宿主 fetch 代替 guest 传输。25 项测试覆盖 Content-Length、Chunked、close-delimited、任意包边界、UTF-8、截断、超限、歧义帧、控制字符、CSP 与字符集。
$Artifacts = Join-Path (Get-Location) 'build/CSharp/HttpProtocolArtifacts'
dotnet test Tests/XFESystem.HttpProtocol.Tests "-p:ArtifactsPath=$Artifacts"
原生适配器使用 Cosmos 3.0.94 的 IPv4 socket 与 DNS,要求已初始化的单调时钟、timer、网卡及 IPv4 配置。3.0.94 修复了 3.0.88 的失败连接清理和接收语义;ConnectTcp 仍固定等待至多 5 秒,因此适配器要求至少 5.1 秒整次预算,剩余预算不足时不会再发起连接。整个导航共享 deadline;正文、header、行、字段、重定向都有上限。异常且未关闭的 peer 会触发该 transport 的熔断,避免反复累积上游 detached half-close 状态。
HTTPS 当前明确拒绝:没有经过移植和验收的原生 TLS/证书链实现,不降低验证要求。压缩正文与非 UTF-8/ASCII/Latin1 字符集也明确拒绝。
QEMU 独立测试配置需要 -netdev user,id=Net0 -device e1000e,netdev=Net0,内核 CosmosEnableNetwork=true,使用 DHCP 配置;3.0.94 的 DriverKit 初始化/调度模式也必须实际验证。已配置后把 new NativeWebTransport() 显式注入 BrowserService。
受控 host 端点:
python Tests/XFESystem.HttpProtocol.Tests/Fixtures/NativeHttpServer.py --Port 18080 --Nonce OneRunRandomValue --Log build/CSharp/HttpPeer/HttpServer.jsonl
服务仅监听 127.0.0.1,guest 经 QEMU NAT 访问 http://10.0.2.2:18080/Index。它只提供固定测试字节,不访问 guest 文件,不替 guest 请求网站。每次使用不同 nonce,guest 串口和截图出现该 nonce 才能关联本次响应。
端点:
| 路径 | 行为 |
|---|---|
/Index |
Content-Length、中文、nonce、真实 inline JS 修改 DOM 为 Native network JS: 42 |
/Chunked |
多次字节分块、chunk extension 与 trailer |
/Redirect |
跳转 /Index |
/Csp |
script-src 'none',自动脚本应被阻止 |
/Truncated |
少于 Content-Length,应拒绝 |
/Oversized |
过大的 Content-Length,应拒绝分配 |
/InvalidFraming |
同时 TE 与 CL,应拒绝 |
/Drop |
无响应关闭,应拒绝 |
/Slow |
等待 30 秒后发正文,供整次 deadline 验证 |
测试脚本应创建自己的 headless QEMU 与服务进程,记录 PID 并在 finally 中清理,不能向用户正在操作的虚拟机输入。纯协议或宿主 socket 测试通过不代表原生网卡路径已验收,须以独立 QEMU 串口、peer 请求日志及画面证据确认。