Чи може CURL надсилати запити в сокети?


75

У мене працює HTTP-сервер /var/run/my-server.sock, і я хочу перевірити його, надіславши простий запит за допомогою CURL. Це можна зробити за допомогою CURL? Це взагалі можна зробити, чи на місці повинен бути зворотний проксі?

Я уявляю щось подібне:

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

Відповіді:


107

Функція була додана в завиток 7.40.

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

Ще один приклад:

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

Що конкретизує GETявно (а не припускає). І не буде буферним (для tail -fоновлення в режимі реального часу).

(Перший реліз Ubuntu, який поставляється із завитком 7.40 або новішим, був 15.10).

для CURL 7,50 і вище потрібно надати дійсну URL-адресу , включаючи ім'я хоста, тому для запуску вищевказаних прикладів з курсом 7UR, потрібно додати "фіктивне" ім'я хоста, наприклад:

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

і

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

1
Це круто!
Хубро

І в цьому прикладі я бачу саму розетку, в яку я збирався curlврешті-решт. Хай живе Докер!
spacediver

До речі, приклади netcat та socat вже не вище :]
Hubro,

Це дійсно корисно. Однак я намагаюся це зробити, curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventsале згортання не може підключитися до сервера. Я спробував використовувати бібліотеку докерів у рубіні, і вона прекрасно підключається за допомогою цього
user1513388

1
@ user1513388 Я впевнений, що вам потрібно вказати шлях до сокета як аргумент --unix-socket, а не URI.
Хубро

8

Не впевнений, але відповідно до цього квитка:

мабуть, це не так.

З цього приводу:

здається, що socat або nc можуть це зробити, знімати з наведеного вище фрагменту:

# 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

Не пробував і я.


4
це працює за винятком того, що ви можете надати \r\n\r\nнаприкінці, а не\r\n echo -e "GET / HTTP/1.1\r\n\r\n"
TheRusskiy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.