Может ли cURL отправлять запросы в сокеты?

75

У меня работает HTTP-сервер /var/run/my-server.sock, и я хочу проверить его, отправив простой запрос с использованием cURL. Можно ли это сделать с помощью cURL? Можно ли это сделать вообще или должен быть установлен обратный прокси-сервер?

Я представляю что-то вроде этого:

curl socket:/var/run/my-server.sock:/test/path
Hubro
источник

Ответы:

108

Функция была добавлена ​​в curl 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, выпущенная с curl 7.40 или новее, была 15.10).

cURL 7.50 и выше требует предоставления действительного URL , включая имя хоста, поэтому для запуска приведенных выше примеров с cURL 7.50 необходимо добавить «фиктивное» имя хоста, например:

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

а также

curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events
Dreamcat4
источник
1
Это круто!
Hubro
И в этом примере я вижу тот самый сокет, в который я собирался curlв конце концов. Да здравствует Докер!
космонавт
Кстати, примеры с netcat и socat больше не приведены выше :]
Hubro
Это действительно полезно. Тем не менее, я пытаюсь это сделать, curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventsно curl не может подключиться к серверу. Я попытался использовать библиотеку ruby ​​docker, и она прекрасно подключается, используя это
user1513388
1
@ user1513388 Я уверен, что вы должны указать путь к сокету в качестве аргумента --unix-socket, а не URI.
Hubro
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