Je suis en train d'essayer d'écrire un simple gestionnaire pour un webhook en utilisant xinetd et bash. J'ai le cas trivial fonctionnant avec cette configuration pour xinetd:
service github-hooks
{
port = 61000
socket_type = stream
protocol = tcp
wait = no
user = ubuntu
server = /home/ubuntu/github-hooks.sh
}
et ce script bash:
#!/bin/bash
echo -e "HTTP/1.1 200 OK"
Maintenant, je veux lire les données post qui sont envoyées dans le webhook afin de pouvoir faire quelque chose de plus intéressant que de renvoyer toujours 200.
Comment puis-je lire les données post depuis mon script bash?
J'ai essayé:
while read line; do
echo "$line" >> /home/ubuntu/test
done < /dev/stdin
mais ça ne fonctionne pas pour moi.
Édition
Grâce à la suggestion ci-dessous, j'ai arrêté xinetd
et utilisé nc
pour voir quelles données brutes arrivaient sur le fil:
$nc -l 61000
et j'ai obtenu ceci:
POST / HTTP/1.1
Host: :61000
Accept: */*
User-Agent: GitHub-Hookshot/375c44e
X-GitHub-Event: pull_request
X-GitHub-Delivery: 2dc1fb00-1c8e-11e6-9955-64afafb6ce32
content-type: application/json
X-Hub-Signature: sha1=45afd85b7d4312fa8ac4c56638e8e9699e2ddb36
Content-Length: 20558
{"action":"opened","number":116,"pull_request":
Donc, les données sont envoyées. Maintenant, sachant qu'il y a exactement 11 lignes envoyées, je lis exactement 11 lignes:
for i in {0..10}
do
read line
echo "$line" >> /home/ubuntu/test
done
Et, j'obtiens la même sortie (grand succès :)
POST / HTTP/1.1
Host: :61000
Accept: */*
User-Agent: GitHub-Hookshot/375c44e
X-GitHub-Event: pull_request
X-GitHub-Delivery: 2dc1fb00-1c8e-11e6-9955-64afafb6ce32
content-type: application/json
X-Hub-Signature: sha1=45afd85b7d4312fa8ac4c56638e8e9699e2ddb36
Content-Length: 20558
{"action":"opened","number":116,"pull_request":
Peut-être devrais-je juste lire 9 lignes puis utiliser le paramètre Content-Length
pour lire le reste? Je ne comprends toujours pas vraiment ce qui se passe donc toute information serait très utile.