読者です 読者をやめる 読者になる 読者になる

HTTP::Tinyとプロキシ設定に関するメモ

perl

追記

HTTP::Tiny 0.32で no_proxyがサポートされました


http://weblog.bulknews.net/post/52850922612/make-lwp-optional-by-miyagawa-pull-request-408


Plackの LWPの依存が optionalになってから、プロキシ環境下ではテストが
パスしなくなったなぁと思って原因を調査したので、そのメモ。

問題

HTTP::Tinyのプロキシの設定方法が特殊なことが原因でした。LWP::UserAgentや Furl
プロキシ関連の設定するためにはコンストラクトで指定するか、env_proxy関数を
呼び出す必要があるのですが、HTTP::Tinyだと環境変数 http_proxy(全部小文字)を
設定していると勝手に PROXYが設定されてしまいます。そのため Plackのテストで
localhostにアクセスするようなテストがプロキシ経由になってしまい失敗していたと
いうことです。


wget等のアプリケーションでは、no_proxyという環境変数を見て、プロキシを通さない
パターンを指定できるのですが、HTTP::Tinyは今のところ、その対応がないので、
環境変数で設定しようともコンストラクタで指定しようともどうにもできません。


Plack自体に含まれる標準的なテストでは、対象はすべて localhostのようなので、
Plack::LWPishの HTTP::Tinyインスタンス作成部分で "proxy => undef"を明示的に
渡すというのも考えたのですが、Plackのテスト周りは localhostに限らず汎用的に
作られているので、対応をするとしたら HTTP::Tinyにするほうが筋なのかなと
思いました。

おわりに

HTTP::Tinyに切り替えて、何か問題が発生したという報告を受けた方は
Proxy周りを疑ってみるともしかするかもしれないですね。
まああんまり Proxyの設定している人はいないかもしれないですが・・・。


とりあえず Plackについては cpanm --notestでインストールするか、
気になる人は http_proxy環境変数を一時的に無効にするなどすればよいでしょう。
(それでも問題が残ったら何か問題がある可能性があるかもしれませんので、
その場合は詳しく見てみるといいかもしれません)


しかし LWP::UserAgentの env_proxyは大文字、小文字関係ないけど、
Furlの env_proxyは大文字だけであったり、HTTP::Tinyは http_proxy
しか受け付けなかったりややこしいですね。Perlのモジュールに限らず、
同様のことが見られるので仕方ないのかもしれないですが、両方
設定するが馬鹿らしいので、大文字、小文字統一できなかったのかと
思います。