プロキシがある場合のツールの設定いろいろ その2

プロキシがある場合のツール等の設定いろいろ - penultimate diary の続き。各ツールでのWindows環境における認証つきプロキシの通り方。

npm

コマンドプロンプトで以下のようにする。

npm config set proxy http://<username>:<password>@<proxy-host>:<proxy-port>
npm config set https-proxy http://<username>:<password>@<proxy-host>:<proxy-port>

一応補足すると username, password はプロキシのユーザ名・パスワード。proxy-host と proxy-port はプロキシサーバのホスト名とポート番号。
上では HTTP も HTTPS も同じプロキシを設定しているが、違うのならURLを変更すること。

また、私の環境だけかもしれないが、プロキシ越しだと証明書のエラーにより通信できないため、以下のコマンドも実行する必要があった。ただ、これを行うと接続先が本当に本物の npmjs.org サイトかどうか検証しなくなるということなので、良く考えること。

npm config set strict-ssl false

認証情報についての補足

上記の npm のようにプロキシをURL形式で指定する場合、URLなので認証情報部分(上記の username, password)などはURLエンコードして設定するのが正しいはず。

例えば npm では、ユーザ名 user、パスワード P@ssword の場合、以下のようにすれば正しく設定される。

npm config set proxy http://user:P%40ssword@proxy.example.com:8080

ところが gem というか rubyURI ライブラリだか Net::HTTP ライブラリだかは認証情報部分をきちんとデコードしてくれないので、

set http_proxy=http://user:P%40ssword@proxy.example.com:8080

は、パスワードがそのまま "P%40ssword" で送られてしまい認証に失敗するし、かといって

set http_proxy=http://proxy.example.com:8080
set http_proxy_user=user
set http_proxy_pass=P@ssword

のように指定してみても、↓こんな風に

ERROR:  While executing gem ... (URI::InvalidComponentError)
    bad component(expected user component): P@ssword

URLの認証情報部分として形式がおかしいとかエラーが出て通信できない。つまり、認証情報にアットマークを含むと八方塞がり。

しょうがないので Rubyのホームディレクトリ\lib\ruby\1.9.1\uri\generic.rb の438-441行目を一時的にコメントアウトして

#      if parser.regexp[:USERINFO] !~ v
#        raise InvalidComponentError,
#          "bad component(expected user component): #{v}"
#      end

とした上でURLエンコードせず http_proxy_pass=P@ssword で設定したら上手くいくようになった。