ITわんこは今日も征く

ガジェット食べ物 ときどき アプリ

【socket.io】socket.io に Proxy を経由してアクセスする(認証もOK)

スポンサーリンク

f:id:natzsoft:20160125204514p:plain


どもNatzです。

最近 JavaScript を勉強しようとした理由のひとつとして、 Electron の他に socket.io を利用したかったということがありました。そんななか、 socket.io でプロキシを利用したアクセス方法がわからなかったのですが、いろいろやって動作できるようになりました。

http-proxy-agent

もともと Node.js に http.Agent という仕組みがあって、プロキシを利用したアクセスができるようである。その Agent を簡単に生成できるのが http-proxy-agent 。

github.com


まずはインストール。

$ npm install http-proxy-agent



ちなみに他にも、 tunnnel とか tunnnel-agent なんかもある。が、今回一番しっくりきたのは http-proxy-agent だった。

github.com

github.com


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 を利用してアクセスできるようになった。やりたいことにまた一歩近づいてきたよ。


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