CURL può inviare richieste ai socket?


75

Ho un server HTTP in esecuzione su /var/run/my-server.socke voglio testarlo inviando una semplice richiesta utilizzando cURL. Questo può essere fatto usando cURL? Può essere fatto del tutto o deve esserci un proxy inverso in atto?

Sto immaginando qualcosa del genere:

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

Risposte:


107

La funzione è stata aggiunta in arricciatura 7.40.

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

Un altro esempio:

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

Che specifica GETesplicitamente (piuttosto che assunto). E non bufferizzerà (per tail -fl'aggiornamento in tempo reale).

(La prima versione di Ubuntu distribuita con arricciatura 7.40 o successive era il 15.10).

cURL 7.50 e versioni successive richiedono che sia fornito un URL valido , incluso un nome host, quindi per eseguire gli esempi precedenti con cURL 7.50, è necessario aggiungere un nome host "fittizio", ad esempio:

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

e

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

1
Questo e spettacolare!
Hubro,

E in questo esempio vedo la presa in cui stavo andando curldopo tutto. Lunga vita a Docker!
spaziatore

A proposito, gli esempi di netcat e socat non sono più sopra :]
Hubro

Questo è davvero utile Tuttavia, sto provando a farlo curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventsma l'arricciatura non riesce a connettersi al server. Ho provato ad usare la libreria docker ruby ​​e si collega bene usando questo
user1513388

1
@ user1513388 Sono abbastanza sicuro che devi fornire il percorso a un socket come argomento --unix-socket, non un URI.
Hubro,

8

Non sono sicuro, ma secondo questo biglietto:

non sembra essere il caso.

Per questo:

sembra che socat o nc possano farcela, taglia da quella precedente:

# 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

Non ho provato neanche me stesso.


4
funziona con l'eccezione che puoi fornire \r\n\r\nalla fine, non\r\n echo -e "GET / HTTP/1.1\r\n\r\n"
TheRusskiy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.