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/
にアクセスしてみたら以下のように表示された。
とりあえず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を上書きしたりできるみたい。まあ、実際試してないので上記のような書き方でちゃんと動くのかは保証できないが...