Cubbyのルーティングの問題点

Cubbyのルーティング(URLとActionのマッチング)は非常に柔軟で、下記の様にした場合は /hoge/fuga で HogeAction#fuga が呼び出される。

@Path("hoge")
public class HogeAction extends Action {
    @Path("fuga")
    public ActionResult fuga() throws Exception {
    }
}

じゃあ、Amazonの商品ページのようにURLエンコーディングされたURLはどうなるかな?と思ってやってみたらうまくいかなかった。
調べてみるとCubbyのPathアノテーションはデフォルトで正規表現 [a-zA-Z0-9]+ でマッチングされているらしい。

ということはURLエンコーディングに合わせた正規表現にすればいいのかと思ってパーセントエンコーディングにマッチする正規表現を書いてみたが、これまたうまくいかなかった。
悩んでCubbyのソースを読んでみたら、マッチングはデコードしたURIに対して行われることが判明した。なるほど。


で、ここからが本題。ルーティング関連のソースを読んで気がついた点があった。

CubbyはPathResolverImpl#getInternalForwardInfoで独自のエンコーディングURIのデコードを行っている。これはコンテナで指定されているURIエンコーディングと一致しなかった場合に問題になりそうな感じ。
これ→http://sastruts.seasar.org/fileReference.html#server

RouterImpl#routingの中のCubbyUtils#getPathで返すパスは、HttpServletRequest#getPathInfoの値とほぼ同じ値(こっちはコンテナでURIデコードされる)だと思うので、この値を使えば独自にデコードする必要もなくなって、いい感じじゃないかと思う。(デコードしないURIを使用していることに意図がなければ)

どうでしょうか中の人