【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');

// HTTP/HTTPS proxy to connect to
var proxy = process.env.http_proxy || 'http://192.168.10.10:3128';
// create an instance of the `HttpProxyAgent` class with the proxy server information
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 を利用してアクセスできるようになった。やりたいことにまた一歩近づいてきたよ。

やっぱ、プログラミングは楽しいね。

スポンサーリンク