Chrome发送HTTP请求时服务器接收内容异常的技术求助
前言
这可能是我15年职业生涯中遇到的最诡异的问题。在特定设备上,特定用户通过Chrome发送特定请求时,问题100%可复现,但使用Edge、cURL或Postman则不会出现。我不奢求精准解决方案,但非常欢迎任何可能的原因排查方向。
问题现象
工厂内有多台PC与本地部署的中心HTTP服务器(同局域网)通信。当某用户在特定设备上执行特定操作时,会收到“HTTP错误”提示,服务器返回400状态码,提示请求中的JSON格式错误。该JSON为80字符的合法字符串,请求的Content-Length也为80,但仍触发400错误。
同一用户在其他设备、其他用户在该设备执行相同操作均可正常请求;该用户在同一设备上使用Edge(同为Chromium内核)也可正常请求。从浏览器开发者工具导出的Chrome和Edge请求格式完全一致。
UI使用Axios发送请求,改用fetch、自行序列化JSON后发送仍会报错;但使用cURL、Postman等其他客户端发送相同请求则正常,与Edge表现一致。
问题排查与临时修复
服务器基于.NET 5的ASP.NET Core构建,我添加了中间件记录接收的请求。发现在特定条件下,服务器接收的请求体与客户端发送的不一致:
客户端发送:
{"key1":"value1","key2":"value2"}
服务器接收(实际异常内容):
{"key1":"value1","key2":"value2"}
(注:实际服务器接收的内容开头多一个换行符,结尾缺少闭合大括号,请求体开头多一个字符、末尾字符丢失,推测是未发送或因Content-Length被截断,最终导致JSON解析失败触发400错误。)
为解决生产阻塞问题,我编写了“修复”中间件:若Content-Type为JSON且解析失败,检查开头是否有非大括号字符,若有则移除该字符并添加闭合大括号,修复后继续处理请求并邮件通知我。
后续情况
修复后运行正常,我们认为是设备系统或浏览器配置问题,更换了问题设备。但更换后,该设备上的另外两名用户再次触发该问题(不同请求,但每个用户对应固定请求),请求指向不同URL,请求体长度和JSON复杂度不同,仍由中间件修复。
同事反馈数月前也曾出现类似问题,更换设备后消失,未深入排查。问题看似随机,目前仍未知原因。
平台信息
- 客户端:Windows 10 PC,以kiosk模式运行Chrome,通过网络共享中的批处理启动;
- UI:React,使用Axios发送HTTP请求;
- 服务器:.NET 5 ASP.NET Core服务。
更新
在客户端PC上用Wireshark抓包发现,请求在离开客户端主机时就已被篡改。
内容的提问来源于stack exchange,提问作者Simone

