Est-ce que cURL peut envoyer des requêtes aux sockets?


75

J'ai un serveur HTTP à /var/run/my-server.sock, et je veux le tester en envoyant une simple requête en utilisant cURL. Cela peut-il être fait avec cURL? Cela peut-il être fait ou faut-il un proxy inverse?

J'imagine quelque chose comme ça:

curl socket:/var/run/my-server.sock:/test/path

Réponses:


108

La fonctionnalité a été ajoutée dans curl 7.40.

curl --unix-socket /var/run/docker.sock http:/images/json

Un autre exemple:

curl --no-buffer -XGET --unix-socket /docker.sock http:/events

Qui spécifie GETexplicitement (plutôt que supposé). Et ne sera pas tampon (pour la tail -fmise à jour en temps réel).

(La première version d'Ubuntu à être livrée avec curl 7.40 ou plus récente était 15.10).

cURL 7.50 et versions ultérieures nécessitent la fourniture d'une URL valide , y compris un nom d'hôte. Pour exécuter les exemples ci-dessus avec cURL 7.50, un nom d'hôte "factice" doit être ajouté, par exemple:

curl --unix-socket /var/run/docker.sock http://localhost/images/json

et

curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events

1
C'est génial!
Hubro

Et dans cet exemple, je vois la prise dans laquelle je m'apprêtais à aller curlaprès tout. Longue vie à Docker!
Spacediver

En passant, les exemples netcat et socat ne sont plus au - dessus :]
Hubro

C'est vraiment utile. Cependant, j'essaie de faire cela, curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventsmais curl ne peut pas se connecter au serveur. J'ai essayé d'utiliser la bibliothèque ruby ​​docker et il se connecte très bien avec cet utilisateur
user1513388

1
@ user1513388 Je suis presque sûr que vous devez fournir le chemin d'accès à un socket comme argument --unix-socket, pas un URI.
Hubro

8

Pas sûr, mais selon ce billet:

cela ne semble pas être le cas.

Par ceci:

on dirait que socat ou nc peut le faire, coupez le coup ci-dessus:

# Socat version
echo -e "GET /images/json HTTP/1.1\r\n" | socat unix-connect:/var/run/docker.sock STDIO

# nc version (netcat-freebsd)
echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock

Je n'ai pas essayé non plus moi-même.


4
cela fonctionne à l'exception que vous pouvez fournir \r\n\r\nà la fin, pas\r\n echo -e "GET / HTTP/1.1\r\n\r\n"
TheRusskiy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.