UrlRewriteFilterに手を入れてみた

1,122 views
1,054 views

Published on

UrlRewriteFilter の障害報告 Issue120 を修正してみました、という発表です。

2013-11-16 第四回 #渋谷java にて発表しました。
http://connpass.com/event/3744/

修正したパッチはこちら。
https://code.google.com/p/urlrewritefilter/issues/detail?id=120#c4

コンパイル済みjarファイルはこちらからどうぞ。
http://www7b.biglobe.ne.jp/~archer/urlrewritefilter/issue120.html

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,122
On SlideShare
0
From Embeds
0
Number of Embeds
170
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

UrlRewriteFilterに手を入れてみた

  1. 1. UrlRewriteFilterに 手を入れてみた 福原和朗 2013-11-16 1
  2. 2. 自己紹介 • 福原和朗 – @kazurof • 客先常駐で開発やってます • Webサービス • Android, iPhone アプリ (Titanium Alloy) • アクシオヘリックス(株) – http://www.axiohelix.com/ • 開発案件あれば、ご連絡ください。 • エンジニア募集しています。 2
  3. 3. UrlRewriteFilter • リクエストのURLを書き換えるライブラリ – 外向きには綺麗なURLを提示し、内部ではフレー ムワーク標準に合うURLが使えるようにする。 – http://tuckey.org/urlrewrite/ http://example.org/repo/data/123/なんとかかんとか http://example.org/repo/data/get.do&id=123 3
  4. 4. 事の発端 • 利用者から障害報告が来ました。 – バージョン3系から4系に上げた後。 利用者からのメール引用 以下をダウンロードしようとしたところ ページにアクセスできません とエラーとなりました。ご確認いただけますと幸いです。 http://example.org/download/data1234/link/datafile.xls 4
  5. 5. 3系と4系の違い • URL変換の指定と実際の動作を調べてみた。 実際に変換の指定をしているところ <to>/file/download.action?workId=$1&amp;fileTyp e=${escape:$2}&amp;fileName=${escape:$3}&amp ;originalUrl=%{request-url}</to> • ${...} の部分の括弧対応がおかしい。 – それぞれ処理されるべきだが全体で一括で処理 されている。 5
  6. 6. ${...} とは何か • 関数 – ${<関数名>:<引数>:...} というような形 – escape , replaceなど色々 ${upper:hello} HELLO ${trim: nantoka nantoka } http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#functions 6
  7. 7. 関数が複数あるとき • 関数の連続はNG "a${upper:hoge} ${lower:fOObAR} b " "aHOGER} ${LOWER:FOOBAR b" この部分が無視される • 関数の入れ子はOK "a${trim:AbCd ${lower:fOObAR} 1234 } b " "aAbCd foobar 1234 b“ 7
  8. 8. 既にissue listに上がってました https://code.google.com/p/urlrewritefilter/issues/detail?id=120 関数が連続してるとNGだよ、と。 3.2.0では問題なかったと。 8
  9. 9. 上がってはいますけど • いつ解決されるかはわからない。 – なるべくなら最新版のものを早く使いたい。 • 必要な物は自分でつくるべき 直してみることにしました。 9
  10. 10. 修正してみよう • 現在の挙動を調べてみた 関数の開始と終了を正規表現で識別 "a${trim:AbCd ${lower:fOObAR} 1234 } b " 引数の部分を再帰的に処理 関数がないか識別 AbCd ${lower:fOObAR} 1234 10
  11. 11. やりたいこと • 関数が続いていても入れ子でも動作すること "a${upper:hoge} ${lower:fOObAR} b " "a${trim:AbCd ${lower:fOObAR} 1234 } b " • 設定を木構造として解釈できればよい。 11
  12. 12. 木構造として解釈 "a${trim:AbCd ${lower:fOObAR} 1234 } b " ‘b ’ 関数 ‘a’ 関数パラメータ 関数名 ‘trim’ ‘AbCd ’ 関数名 ‘lower’ 関数 ‘ 1234 ’ 関数パラメータ ‘fOObAR’ 12
  13. 13. Interpreterパターン http://www.hyuki.com/dp/cat_Interpreter.html 13
  14. 14. 新しいやり方の概略 • 変換先パターンをツリー構造へ解析 – 関数とか文字列そのものがノード "a${trim:AbCd ${lower:fOObAR} 1234 } b " • それぞれのノードから処理結果を取得する。 14
  15. 15. 必要なもの • 文法規則 – 拡張BNFの形式 – 解釈の仕様 • 入力を切り分けるクラス – トークン化する • それぞれのノードを表す クラス。 – 処理結果取得メソッド付き 15
  16. 16. 拡張BNF <tovalue> :== <element> * <element> :== <value> | <function> <value> :== any string <function> :== ${ <functionContent> } <functionContent> :== <functionName> : <param> <param> :== <element> * | <element> * : <param> <functionName> :== replace | replaceAll | replaceFirst | escape | escapePath | lower | upper | toLower | toUpper | trim | length ${ , } , : が、文法上意味を持つ。これ重要!! 16
  17. 17. トークン化クラス • ${ } : を基準に文字列を切り分ける。 a${trim:AbCd ${lower:fOObAR} 1234 } b a ${ trim : AbCd ${ lower : fOObAR } 1234 } b 17
  18. 18. ノードを表すクラス 例:関数の中身を表現するBNFとそれを表すクラス <functionContent> :== <functionName> : <param> public class FunctionContentNode implements Node { private FunctionNameNode funcNameNode; private ParamNode paramNode; public void parse(Context context) throws ParseException { funcNameNode = new FunctionNameNode(); funcNameNode.parse(context); context.skipToken(“:”); paramNode = new ParamNode(); paramNode.parse(context); } 18
  19. 19. Interpreterをやってみた印象 • それぞれの役割がはっきりしている – トークナイザはただ区切って出すだけ。 – 各々のノードが各々の構文チェックのみを行う。 • 別の構文については何もしない。 19
  20. 20. (とりあえず)完成! • 実サービスで現在稼働しています。 • パッチを本家に送ってみました。 – マージされれば御の字 https://code.google.com/p/urlrewritefilter/issues/detail?id=120#c4 • ビルド済みjarファイル公開しています。 http://www7b.biglobe.ne.jp/~archer/urlrewritefilter/issue120.html 20
  21. 21. まとめ • 同じ問題に遭遇された方はどうぞ使ってみて 下さい。 – OSSのおかげで自己解決&他者へ貢献出来ました。 • Interpreterの練習が出来ました。 – 実業務ではやったことは無かった。 – プログラミングは実際に書いて動かすのが重要。 21
  22. 22. ご清聴ありがとうございました。 22

×