【socket.io】socket.io に Proxy を経由してアクセスする(認証もOK)
最近 JavaScript を勉強しようとした理由のひとつとして、 Electron の他に socket.io を利用したかったということがありました。そんななか、 socket.io でプロキシを利用したアクセス方法がわからなかったのですが、いろいろやって動作できるようになりました。
http-proxy-agent
もともと Node.js に http.Agent という仕組みがあって、プロキシを利用したアクセスができるようである。その Agent を簡単に生成できるのが http-proxy-agent 。
まずはインストール。
$ npm install http-proxy-agent
ちなみに他にも、 tunnnel とか tunnnel-agent なんかもある。が、今回一番しっくりきたのは http-proxy-agent だった。
socket.io クライアントでの実装
使い方はこんな感じ。環境変数 http_proxy の値を取り出して、それを利用して Agent を生成するという処理。host や port を個別に設定したい場合は、他のライブラリを利用したほうが便利かもしれない。
var client = require('socket.io-client');
var HttpProxyAgent = require('http-proxy-agent');
var proxy = process.env.http_proxy || 'http://192.168.10.10:3128';
var agent = new HttpProxyAgent(proxy);
var socket = client.connect('http://yourdomain.com', { agent: agent });
socket.on('connect', function() {
console.log('Socket connected!');
socket.on('data', function(data) {
console.log(data);
});
socket.on('disconnect', function() {
console.log('Socket disconnected!');
});
});
結局のところは、 socket.io-client にどういうふうに Agent を渡したら良いのだ?というところでつまづいていたわけだが、分かってみたら簡単で、 connect の第二引数として渡せば良いだけだった。ドキュメント読んでもよく分からなかった。
プロキシ認証も問題なく行える。このライブラリの場合は、環境変数 http_proxy が例えば「ttp://user:pass@host:port」のような記載になっていればその内容を利用して設定をしてくれる。
まとめ
これで、プロキシが必要な環境でも socket.io を利用してアクセスできるようになった。やりたいことにまた一歩近づいてきたよ。
やっぱ、プログラミングは楽しいね。