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を使用していることに意図がなければ)
どうでしょうか中の人?