Electron アプリは「メインプロセス」と「レンダラープロセス」の 2 種類を扱わないといけないので、プロキシの設定でハマりがちです。 ここでは、システム (OS) のプロキシ設定を、自動的に両プロセスに反映する方法を説明します。 この仕組みを入れておけば、ユーザーにわざわざプロキシの設定をしてもらわなくて済むようになります。
レンダラープロセスの HTTP 通信
レンダラープロセス側は、Chromium の仕組みで システムのプロキシ設定が自動的に反映される ようになっています。
例えば、Web ブラウザ上の JavaScript で使用する XMLHttpRequest
関数や fetch
関数による HTTP 通信は、自動的にプロキシ経由で実行されます。
この振る舞いで問題なければ、特に設定を行う必要はありません。
BrowserWindow
で扱うプロキシを明示的に指定するには、session オブジェクトの setProxy メソッド を使用します。
メインプロセスの HTTP 通信
Electron のメインプロセスはいわゆる Node.js アプリケーションと同様の仕組みで動作するので、Web ブラウザ側のプロキシ設定が自動的に反映されるようなことはありません。
しかし、electron
モジュールが提供する session
オブジェクトには、Chromium 側のプロキシ設定を参照する機能が備わっています。
この情報を利用すれば、メインプロセス側のプロキシ設定も自動的に行うことができます。
下記の autoProxy()
関数をメインプロセス起動直後に呼び出しておけば、メインプロセス側で実行する HTTP 通信に対してシステムのプロキシ設定が反映されます。
処理の流れは次の通りです。
app.once('ready')
になってからsession.defaultSession
でsession
オブジェクトを取得する。session.resolveProxy()
でシステムのプロキシ情報を取得する。 プロキシ情報は文字列で返され、プロキシ設定されているときはPROXY <address:port>
、プロキシ設定されていないときはDIRECT
になる。- システムにプロキシが設定されている場合は、その値を
global-agent
モジュールのbootstrap()
でメインプロセス側の HTTP 通信に反映する。