Как читать и обрабатывать POST-запросы с Netcat - PullRequest
0 голосов
/ 08 июля 2019

Я хочу создать простой HTTP-сервер с Bash & netcat, и у меня проблема с полным чтением 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.

Вопрос, вероятно, можно обобщить как как мне прочитать HTTP-запросы в правильной двоичной форме в Bash?

1 Ответ

0 голосов
/ 08 июля 2019

Попробуйте, как показано ниже.

#!/bin/bash

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

Укажите, чтобы заметить.

IFS= для сохранения любого отступа.
-r для предотвращения интерпретации обратной косой черты.
Проверка на INPUT: когда read достигает конца файла вместо конца строки, он присваивает переменную, но завершается. следовательно, проверьте, есть ли у нас что-нибудь в INPUT.

...