CocProxyを使ってみた(そしてハマった点とかのメモ)

このダイアリーのデザインが崩れてしまってスタイルシートとかいろいろいじって確認したかったので、CocProxyを使ってローカル環境を使って調査してみた。
その中でちょっとハマったところをメモ。

Mongrelのインストール

自分の環境はRuby1.8.7だったので、Mongrel版を使うことにした。
Mongrel自体もまだ使ったことが無かったので使ってみたいという興味もあったので、一石二鳥ということで。

$ sudo gem install mongrel

Mongrelのインストールは無事完了。
念のためmongrelが動いていることを確認してみる。
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5 に移動してREADMEを確認してみる。
どうやらexampleがあるらしいので、exampleの中身を覗いてみる。それらしいやつで simpletest.rb ってのがある。中身を見てみると、受け取ったリクエスYAML形式でブラウザに返す簡単なサーバのプログラムっぽい。実行してみ>た。

$ ruby simpletest.rb localhost 80001 .

スクリプトのパラメタとして,,を受け取るようになっている。
webブラウザhttp://localhost:80001/にアクセスしてみたら以下のように表示された。
http://gyazo.com/913ef13ae54fd06579edb02deb7925ea.png
とりあえずmongrelのインストールはOKっぽい。

CocProxyを動かしてみる

上記からMongrel版のCocProxyをダウンロードして、とりあえず、CocProxyの「使い方」に従って作業用のフォルダにfilesフォルダを作って。

$ ruby mongrel-proxy.rb

とやってみる。すると

Use default configuration.
Port : 5432
Dir  : files/
Cache: true
Rules:
    1. #{File.basename(req.path_info)}
    2. #{req.host}#{req.path_info}
    3. #{req.host}/#{File.basename(req.path_info)}
    4. .#{req.path_info}

と表示された。
ブラウザのproxyの設定を上記を参考に変更してはてなダイアリーのページにアクセスしてみる。
ブラウザでは正常に表示できた。でも、CocProxyのコンソールの出力では

Sat Jan 03 21:24:34 +0900 2009: Read error: #<RuntimeError: No REQUEST PATH>
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:131:in `process_client'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new'
/opt/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run'
mongrel-proxy.rb:125:in `run'
mongrel-proxy.rb:47:in `run'
mongrel-proxy.rb:294

というエラーが大量に出てきている。うーん何が悪いんだろう...
とりあえず、今はこのメッセージを無視して先に進んでみることにした。

リモートのコンテンツをローカルに持ってきて調査してみた

とりあえず、http://d.hatena.ne.jp/snaka72/20090103/1230958652というURLでアクセスしたときの内容を元に調査することにした。
以下のようにローカルに配置するためのコンテンツをcurlコマンドで取得する。

$ curl http://d.hatena.ne.jp/snaka72/20090103/1230958652 > 1230958652

すると"1230958652"というファイルにサーバから返ってくるHTMLの内容を保存されるので、こいつをfilesフォルダの中に格納してブラウザからアクセスしてみる。
でも、ブラウザでアクセスすると、コンテンツをダウンロードしようとしてしまう。
Content-Typeの解釈がおかしいんじゃないかと思い、mongrel-proxy.rbのソースでMimeTypeをHTTPヘッダに設定しているらしきところを見つけたので、putsを仕込んでContent-Type:ヘッダの内容を確認してみる。

        res.start do |head, body|
          head["Content-Type"] = WEBrick::HTTPUtils.mime_type(req.path_info, mime_types)
          body << content
          puts  WEBrick::HTTPUtils.mime_type(req.path_info, mime_types) # <= for debug
        end

するとどうやらapplication/octet-streamになっているらしいことがわかった。
念のため、正常の場合のContent-Typeがどうなっているのかをcurlコマンドで調べてみた。
curlでは--headオプションでhttpヘッダの内容のみ表示してくれる。

$ curl --head  http://d.hatena.ne.jp/snaka72/20090103/1230958652
HTTP/1.1 200 OK
Date: Sat, 03 Jan 2009 13:22:11 GMT
Server: Apache
Last-modified: Sat, 03 Jan 2009 04:57:30 GMT
Content-Type: text/html; charset=euc-jp
Set-Cookie: b=$1$afj9AMMV$J9ZRzSC8OtP6vf.3P6GwW.; path=/; expires=Fri, 29-Dec-28 13:22:11 GMT; domain=.hatena.ne.jp
Vary: Accept-Encoding

通常はContent-Type: text/html; charset=euc-jp というこのなので、こうなってないといけないはず。
で、いろいろ調べたところMimeTypeはWEBric::HTTPUtilsの中でファイルの拡張子を元に決定されるが、拡張子から判別できない場合は"application/octet-stream"としているということがわかった。
今回の場合、ファイル名に拡張子が無かったため、CocProxyが出力HTTPヘッダのMimeTypeが"application/octet-stream"となってしまったため、ブラウザはそれをダウンロードするという動きになってしまったみたい。

対処としては、ローカルのファイル名の最後に".html"という拡張子を追加して、ブラウザからもその".html"付きのURLを入力した。
そうすると、実際のはてなのサーバー上には".html"付きのファイルなんてものは存在しないが、CocProxyが見ているローカルのファイルにはちゃんと存在するので、問題無く表示できた。

ドキュメントに書かれていない機能

最後に、CocProxyのソースを読んでいていて見つけた機能(CodeReposの使い方とかには載っていない)を。
CocProxyでは、それを実行したディレクトリの proxy-config.yamlという設定ファイルがあればそのファイルを読み込んでデフォルト設定を上書きすることができる。
ドキュメントには:Filteer, :Port, :Rules が記載されているが、その他に :MimeType も使えるっぽい。
実際にはまだ使っては無いけど、設定ファイルに

  :MimeType:
    hoge: text/hoge

と書いておくと、新しいMimeTypeを追加したり既存のMimeTypeを上書きしたりできるみたい。まあ、実際試してないので上記のような書き方でちゃんと動くのかは保証できないが...