如何使用Netcat读取和处理POST请求

时间:2019-07-08 06:39:10

标签: bash http post netcat

我想用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请求?

2 个答案:

答案 0 :(得分:0)

尝试如下。

#!/bin/bash

while IFS= read -r INPUT || [ "$INPUT" ]; do
    echo "Req line: $INPUT" >&2
done;   

要注意。

IFS=用于保留任何缩进。
-r是为了防止反斜杠的解释。
检查INPUT:当read到达文件末尾而不是行尾时,它分配变量但退出。因此,请检查INPUT中是否有任何内容。

答案 1 :(得分:0)

你好@x1n13y84issmd42

以防万一您仍在寻找解决方案.. 我在尝试以下操作时取得了不错的结果:

sh

“-d }”选项不是在每一行出现时解析它们,而是让 read 将通过 stdin 传入的所有内容存储在 PAYLOAD 中,直到遇到“}”为止。

然后你可以用 jq 处理 $PAYLOAD}