124

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

180

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
  • 2
    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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .