为何jwebserver不响应终端手动发送的简单HTTP请求?
问题:Bash脚本无法向jwebserver发送HTTP请求,但浏览器可正常访问
场景复现
- 用
php -S localhost:8888启动服务器时,执行以下Bash脚本可正常获取响应:exec 3<> /dev/tcp/localhost/8888 echo -e "GET /hello.html HTTP/1.1 Host: localhost " >& 3 cat <& 3 - 换成
jwebserver -b localhost -p 8888启动服务器后,上述脚本延迟后无输出,jwebserver也无请求接收提示。 - 用
sudo tcpdump -i any port 8888监测发现:- PHP服务器能接收完整请求并返回响应
- jwebserver仅完成TCP握手,无后续请求处理
- 浏览器访问
localhost:8888/hello.html时,jwebserver可正常响应。
原因分析
核心问题是HTTP请求格式不符合规范:
- HTTP/1.1协议要求,请求头结束后必须有两个连续的换行(即一个空行),用于分隔请求头和请求体(即使没有请求体)。
- 你的Bash脚本中,
echo -e输出的内容最后仅包含一个换行(Host: localhost后的换行),缺少第二个空行。 - PHP内置服务器对非标准请求的兼容性更高,会自动补全或忽略这个格式问题;但jwebserver(Java内置的Web服务器,从Java 18引入)遵循更严格的HTTP规范,会一直等待请求结束的标记(第二个空行),导致脚本卡住,服务器也不会处理请求。
- 浏览器发送的请求完全符合HTTP规范,会在请求头后自动添加两个换行,因此jwebserver能正常处理。
解决方法
修改Bash脚本,在Host: localhost后添加一个额外的换行,确保请求头结束后有一个空行:
exec 3<> /dev/tcp/localhost/8888 echo -e "GET /hello.html HTTP/1.1 Host: localhost " >& 3 cat <& 3
内容的提问来源于stack exchange,提问作者Tasos Papastylianou
相关产品推荐
相关产品推荐

