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
Hubro
la source

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
Dreamcat4
la source
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.

pluie continue
la source
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