nanocのauto compilerを日本語を含むURLに対応させる

2010-01-03 21:57 | tag:

nanoc 3.0.2のauto compilerは、日本語を含むURLを正しく扱うことができません。非ASCII文字を含むURLはブラウザによりURL encodeされてサーバにリクエストが送信されますが、auto compilerは受け取ったリクエストのURL decodeを行っていないためです。 nanocのソースコードを修正することにより、この問題に対応しました。

日本語を含むURLを使うと、ファイルが存在するのにも関わらずエラーとなる

2010/01/03 23:40 追記

本件を 報告 したところ、すぐにnanoc本体が修正されました。将来リリースされるであろうnanoc 3.0.3ではこの問題は解決するかと思います。

http://projects.stoneship.org/trac/nanoc/ticket/89

なお、オフィシャルの修正ではURL decodeを行うのに Rack::Utils::unescapeが使用されています。


path = Rack::Utils::unescape(env[‘PATH_INFO’])

修正対象ファイル

$GEM_HOME/gems/nanoc3-3.0.2/lib/nanoc3/extra/auto_compiler.rb

※$GEM_HOMEは、Linuxの場合 /usr/local/lib/ruby/gems/1.8, /usr/lib/ruby/gems/1.8 など。

修正内容

PATH_INFO環境変数から取得したパスの値に対してURL decodeを行うようにしました。URL decodeのコードはRuby添付のcgiライブラリの CGI::unescape のものを利用しました。

--- auto_compiler.rb.org	2010-01-03 15:58:51.000000000 +0900
+++ auto_compiler.rb	2010-01-03 16:05:59.000000000 +0900
@@ -27,7 +27,7 @@
         build_site
 
         # Find rep
-        path = env['PATH_INFO']
+        path = env['PATH_INFO'].gsub(/\+/, ' ').gsub(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
         reps = site.items.map { |i| i.reps }.flatten
         rep = reps.find { |r| r.path == path }