【发布时间】:2019-11-17 15:36:10
【问题描述】:
我想用 Bash 和 netcat 制作一个简单的 HTTP 服务器,但在完全读取 POST 请求时遇到问题 - 最后一行总是丢失。
服务器是这样启动的:
netcat -l -p 8080 -e ./ncserver.sh
ncserver.sh,减少到显示问题的最低限度:
#!/bin/bash
while read INPUT; do
echo "Req line: $INPUT" >&2
done;
我使用 Postman 向服务器发出请求,并希望脚本将整个请求数据转储到 stderr。请求是一个简单的 JSON:
{
name: "Eugene",
age: 34
}
更新: 原始邮递员请求数据:
POST /foo/bar HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 7f5a57a7-1664-e79c-2242-7ba6b638e260
{
name: "Eugene",
age: 34
}
在服务器的输出中,我得到了缺少最后一行 } 的所有标头和请求正文。其他内容类型也是如此,例如 multipart/form-data - 最后一行总是丢失。
注意:如果我在 JSON 后添加一个空行,我可以在终端输出中看到 }。
我尝试使用cat /dev/stdin 而不是read,但得到了No such device or address。
这个问题大概可以概括为如何在 Bash 中以正确的二进制形式读取 HTTP 请求?
【问题讨论】:
-
postman 的原始部分显示什么?如果你使用 curl 会发生什么? curl -d '{"Name":"Eugene", "age":"34"}' -H "Content-Type: application/json" -X POST yourserver.com>
-
不知何故,当我使用 curl 时,根本没有请求正文输出,只有标题和两个空行。邮递员请求非常基本,我用它更新了问题。另外,如果我在 Postman 请求正文中添加新行,它会起作用。
-
我已经用 raw 和 bin 文件对此进行了测试,它适用于 Postman 5.5.4 - google chrome 插件。我没有使用 netcat -e 选项。我正在重定向标准输入 nc -l -p 8080
-
我猜这不完全一样,因为我无法从脚本响应回客户端,而我最终想要这样做。此外,即使我删除了
< ncserver.sh部分,netcat 似乎也是如此。 -
我认为问题归结为
read的行为以及它需要换行符作为分隔符的事实,而请求正文中不存在该换行符。关于如何解决它的任何想法?