endaaman.com

2015-10-07

Tips

curlでUnix Domain SocketでlistenしてるサーバーにHTTPリクエストを送る

curlのバージョン7.40.0からの機能

curlversion >= 7.40.0から、--unix-socketオプションが有効になりました。

$ curl -V
curl 7.43.0 (x86_64-apple-darwin13.4.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets

でバージョンが 7.40.0以降なら、

$ curl --unix-socket /path/to/socket <hostname>

こんな感じでいけます。<hostname>には任意のホスト名を入力します。ここで指定したホスト名が、HTTPヘッダにHost: <hostname>のように直接与えられます。

ちなみにMacを使ってる人はデフォルトのcurlが古い場合があります。僕のは古かったです。curlはHomebrewでインストールできるんですが、自動でリンクを張ってくれないので、

$ brew install curl
$ brew link curl -f

みたいに明示的にリンクする必要があります。

確認用コード

// server.js
var http = require('http');
http.createServer(function(request, response) {
  response.writeHead(200, {});
  response.write('おちんちん');
  response.end();
})
.listen('/tmp/sock');
$ node server.js

unix:/tmp/sockでリッスンするサーバーを起動し、別窓から

$ curl --unix-socket /tmp/sock localhost

とすれば「おちんちん」とレスポンスが返ってきます。

ちなみにnodeのhttpはsocketファイルのバキュームとかしてくれないので、終わったら

$ rm /tmp/sock

として消さないとプロセスが止まっても/tmp/sockというファイルが残ります。


©2024 endaaman.com