@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Rack::Proxy でプロキシ認証が必要な forward proxy の習作

習作なので RFC を読んでいません。実用しないほうがよいです(僕も実用してないです) Squid などを使いましょう。

https://github.com/kyanny/playground/tree/gh-pages/rack-proxy-auth

仕事で IP アドレス制限のかかった API と HTTP でやり取りするために forward proxy を使う必要がありそうで、 curl の -x オプションと -U オプションを使うことを知り、実際それでうまく動いたのだが、プロキシ認証というものを初めて使ったのでいろいろ気になることがでてきて、 Squid の設定とかせずにプロキシ認証の動作検証(主にクライアント側が正しくプロキシサーバを利用できているかの検証)ができないかと思って Rack で書いてみた。

Rack::Proxy はこの記事で書いたようにリクエストとレスポンスを加工するのが目的なので、プロキシ認証の機構は組み込まれてない。そこで call を上書きして、クライアントが送ってきたプロキシ認証の情報をリクエストヘッダから取り出し、正しい認証情報でなかったら 407 Proxy Authentication Required を返す、としてみた。実験用なのでいろいろ決め打ち実装。

最初は何を思ったのか rewrite_env の中で認証情報のチェックをし、 NG だったら Rack::Proxy がリクエストを送り直す処理をする perform_request メソッドを差し替える、という変なことをしていた 6404fe2b1c7ad93302f032d61d86b74df8d9012c 差し替えちゃうと一度でも認証失敗した場合に以後正しい認証情報つきでリクエストしてもずっと 407 を返してしまうので差し戻したりと、謎に謎を重ねる感じになっていた。

これと直接関係ないが、 Ruby プログラムから子プロセスとして Rack アプリケーションを起動し、その HTTP サーバに対してリクエストを送ったりしたあとちゃんと kill して自分自身も終了する、というのがなかなかうまく書けなくて苦労したが、そのおかげで Ruby でのプロセス操作についていい復習になった。 Working With Unix Processes 読んだけど身についてなかったみたいでちょっと悲しい。