ElectronでブラウザのHTTPプロキシ設定を利用する


Electronのアプリで、Web APIの呼び出しなどのためにHTTPリクエストを発行すると、外部サービスにHTTPプロキシ経由での接続のみを許している社内ネットワーク環境下では、何もしないとネットワークエラーになってしまいます。

これを回避するには、HTTPリクエストの送信時にHTTPプロキシ情報を設定する必要があります。もしaxiosなどを使っているのであればリクエストのオプションにproxyを指定してあげることでこの指定が可能です。

const res = await axios.request({
  method: 'GET',
  url: 'https://api.example.com/v1/resource.json',
  proxy: {
    host: 'proxy.intranet.examle.org',
    port: 8000,
  },
});

しかし、そもそもそのHTTPプロキシの情報をどこからとってくればいいの?という問題があります。
もちろんユーザにプロキシ設定などの環境情報を入力させるのも一つの手ですが、エンドユーザに配布するときに無用な設定を強いるのはできるだけ避けたいところです。

ユーザのPC上のOSには、すでにHTTPプロキシの接続設定は保持されているはずです。現にChromeなどのブラウザはその情報を読み取って利用しています。なので、開発したElectronアプリでもそのようにしたいところです。

今回、ElectronのSessionを使うことで、その設定を流用することを試みました。

以下のようにしてデフォルトのsessionオブジェクトからresolveProxy()を呼び出して、任意のURLに対して必要になるプロキシ設定の情報を読み取り可能です。

const { app, session } = require('electron');

app.on('ready', () => {
  session.defaultSession.resolveProxy('https://api.example.com', (proxyInfo) => {
    console.log(proxyInfo); // => "PROXY proxy.intranet.examle.org:8000"
  });
});

ただし、こちらの方法では認証を必要とするプロキシサーバについては対応ができない模様です(返却されるプロキシ情報の文字列に認証情報が含まれない)。
引き続き方法について探っていきたいところです。