Czy cURL może wysyłać żądania do gniazd?

75

Mam uruchomiony serwer HTTP /var/run/my-server.socki chcę go przetestować, wysyłając proste żądanie za pomocą cURL. Czy można to zrobić za pomocą cURL? Czy można to zrobić w ogóle, czy musi istnieć odwrotny serwer proxy?

Wyobrażam sobie coś takiego:

curl socket:/var/run/my-server.sock:/test/path
Hubro
źródło

Odpowiedzi:

107

Funkcja została dodana w curl 7.40.

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

Inny przykład:

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

Który określa GETjawnie (zamiast zakładać). I nie buforuje (do tail -faktualizacji w czasie rzeczywistym).

(Pierwsze wydanie Ubuntu dostarczane z curl 7.40 lub nowszym było 15.10).

cURL 7.50 i nowsze wymagają podania prawidłowego adresu URL , w tym nazwy hosta, więc aby uruchomić powyższe przykłady z cURL 7.50, należy dodać „obojętną” nazwę hosta, na przykład:

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

i

curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events
Dreamcat4
źródło
1
To jest niesamowite!
Hubro,
I w tym przykładzie widzę właśnie gniazdo, w które zamierzałem curl. Niech żyje doker!
spacediver
Nawiasem mówiąc, przykłady netcat i socat nie są już powyżej :]
Hubro
To jest naprawdę przydatne. Jednak próbuję to zrobić, curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventsale curl nie może połączyć się z serwerem. Próbowałem użyć biblioteki Ruby Docker i łączy się dobrze przy użyciu tego
1513388
1
@ user1513388 Jestem pewien, że musisz podać ścieżkę do gniazda jako argument --unix-socket, a nie identyfikator URI.
Hubro
8

Nie jestem pewien, ale zgodnie z tym biletem:

wydaje się, że tak nie jest.

Za to:

wygląda na to, że socat lub nc mogą to zrobić, wycinaj z powyższego wycinka:

# 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

Ja też nie próbowałem.

stały deszcz
źródło
4
działa z wyjątkiem, który można podać \r\n\r\nna końcu, a nie\r\n echo -e "GET / HTTP/1.1\r\n\r\n"
TheRusskiy