117

I have a HTTP server running at /var/run/my-server.sock, and I want to test it by sending a simple request using cURL. Can this be done using cURL? Can it be done at all, or must there be a reverse proxy in place?

I'm imagining something like this:

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

2 Answers 2

170

The feature was added in curl 7.40.

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

Another example:

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

Which specifies the GET explicitly (rather than assumed). And will not buffer (for tail -f realtime update).

(The first Ubuntu release to ship with curl 7.40 or newer was 15.10).

cURL 7.50 and up requires a valid URL to be provided, including a hostname, so to run the above examples with cURL 7.50, a "dummy" hostname has to be added, for example:

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

and

curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events
7
  • 1
    And in this example I see the very socket I was going to curl into after all. Long live Docker!
    – spacediver
    Aug 12, 2015 at 20:09
  • By the way, the netcat and socat examples are no longer above :]
    – Hubro
    Aug 25, 2015 at 15:20
  • 1
    @user1513388 I'm pretty sure you have to provide the path to a socket as the argument to --unix-socket, not a URI.
    – Hubro
    Mar 29, 2016 at 11:21
  • 1
    If the socket file is owned by root, these return Couldn't connect to server until you run sudo curl. Jul 18, 2018 at 2:29
  • 1
    On CentOS 7 this was backported even to the 7.29 curl version. Jun 15, 2022 at 15:51
13

Not sure, but as per this ticket:

it doesn't seem to be the case.

Per this:

seems like socat or nc can do it, snip from the above snip:

# 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

Haven't tried either myself.

1
  • 6
    it works with the exception that you can to provide \r\n\r\n at the end, not \r\n echo -e "GET / HTTP/1.1\r\n\r\n" Feb 8, 2017 at 13:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.