大小写引发的 WebSocket 问题
起因
最近在开发自动记账功能时,收到大量反馈称服务运行一段时间后无法连接到 WebSocket 服务器。
使用各类 API 测试工具及在线工具测试均正常,唯独 okhttp 库报错:
unexpected end of stream on http://192.168.88.20:52045/...排查过程
流量分析
使用 Wireshark 进行流量分析,重点关注 TCP 连接状态。通过对比分析,定位服务端无法正常响应 WebSocket 升级请求的原因。
Note
Wireshark 过滤器配置(仅捕获目标服务器流量):
(ip.dst == 192.168.88.20 || ip.src == 192.168.88.20) && http请求对比
okhttp 发送的请求:
GET / HTTP/1.1Host: 192.168.88.20:52045User-Agent: okhttp/4.12.0Accept-Encoding: gzipConnection: UpgradeSec-Websocket-Extensions: permessage-deflateSec-Websocket-Key: nslIsZAXOhdRv52u5c12YA==Sec-Websocket-Version: 13Upgrade: websocket服务端无响应:

Curl 改写请求(AI 生成):
curl -v \ -H "User-Agent: okhttp/4.12.0" \ -H "Accept-Encoding: gzip" \ -H "Connection: Upgrade" \ -H "Sec-WebSocket-Extensions: permessage-deflate" \ -H "Sec-WebSocket-Key: 2fAy7BjsyrAPezSV/YeRjg==" \ -H "Sec-WebSocket-Version: 13" \ -H "Upgrade: websocket" \ http://192.168.88.20:52045服务端正常响应:

问题定位
通过在线工具对比两次请求内容,发现关键差异:
okhttp发送的字段为Sec-Websocket-*Curl发送的字段为Sec-WebSocket-*
Warning
服务端代码使用 strstr 函数进行字符串匹配,区分大小写,仅识别 WebSocket,导致 websocket(小写)无法匹配。
服务端问题代码:

解决方案
实现不区分大小写的字符串查找函数 strstr_case,替换原有 strstr:
char *strstr_case(const char *haystack, const char *needle) { if (!*needle) { return (char *)haystack; } while (*haystack) { const char *h = haystack; const char *n = needle; while (tolower((unsigned char)*h) == tolower((unsigned char)*n)) { h++; n++; if (!*n) { return (char *)haystack; } } haystack++; } return NULL;}验证
修复后服务端可正常响应 WebSocket 升级请求:
