Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
UrlRewriteFilterに
手を入れてみた
福原和朗
2013-11-16

1
自己紹介
• 福原和朗
– @kazurof

• 客先常駐で開発やってます
• Webサービス
• Android, iPhone アプリ (Titanium Alloy)

• アクシオヘリックス(株)
– http://www.axioh...
UrlRewriteFilter
• リクエストのURLを書き換えるライブラリ
– 外向きには綺麗なURLを提示し、内部ではフレー
ムワーク標準に合うURLが使えるようにする。
– http://tuckey.org/urlrewrite/
h...
事の発端
• 利用者から障害報告が来ました。
– バージョン3系から4系に上げた後。
利用者からのメール引用

以下をダウンロードしようとしたところ
ページにアクセスできません
とエラーとなりました。ご確認いただけますと幸いです。
http:/...
3系と4系の違い
• URL変換の指定と実際の動作を調べてみた。
実際に変換の指定をしているところ

<to>/file/download.action?workId=$1&amp;fileTyp
e=${escape:$2}&amp;file...
${...} とは何か
• 関数
– ${<関数名>:<引数>:...} というような形
– escape , replaceなど色々
${upper:hello}

HELLO

${trim:

nantoka

nantoka }

ht...
関数が複数あるとき
• 関数の連続はNG
"a${upper:hoge} ${lower:fOObAR} b "
"aHOGER} ${LOWER:FOOBAR b"
この部分が無視される

• 関数の入れ子はOK
"a${trim:AbCd ...
既にissue listに上がってました
https://code.google.com/p/urlrewritefilter/issues/detail?id=120

関数が連続してるとNGだよ、と。
3.2.0では問題なかったと。

8
上がってはいますけど
• いつ解決されるかはわからない。
– なるべくなら最新版のものを早く使いたい。

• 必要な物は自分でつくるべき

直してみることにしました。
9
修正してみよう
• 現在の挙動を調べてみた
関数の開始と終了を正規表現で識別
"a${trim:AbCd ${lower:fOObAR} 1234 } b "
引数の部分を再帰的に処理
関数がないか識別
AbCd ${lower:fOObAR}...
やりたいこと
• 関数が続いていても入れ子でも動作すること
"a${upper:hoge} ${lower:fOObAR} b "
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

• 設定を木構造として解釈で...
木構造として解釈
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

‘b ’

関数

‘a’

関数パラメータ

関数名 ‘trim’

‘AbCd ’

関数名 ‘lower’

関数

‘ 1234 ’
...
Interpreterパターン
http://www.hyuki.com/dp/cat_Interpreter.html

13
新しいやり方の概略
• 変換先パターンをツリー構造へ解析
– 関数とか文字列そのものがノード
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

• それぞれのノードから処理結果を取得する。

14
必要なもの
• 文法規則
– 拡張BNFの形式
– 解釈の仕様

• 入力を切り分けるクラス
– トークン化する

• それぞれのノードを表す
クラス。
– 処理結果取得メソッド付き
15
拡張BNF
<tovalue> :== <element> *
<element> :== <value> | <function>
<value> :== any string
<function> :== ${ <functionConte...
トークン化クラス
• ${ } : を基準に文字列を切り分ける。
a${trim:AbCd ${lower:fOObAR} 1234 } b

a

${

trim

:

AbCd

${

lower

:

fOObAR

}

123...
ノードを表すクラス
例:関数の中身を表現するBNFとそれを表すクラス
<functionContent> :== <functionName> : <param>

public class FunctionContentNode implem...
Interpreterをやってみた印象
• それぞれの役割がはっきりしている
– トークナイザはただ区切って出すだけ。
– 各々のノードが各々の構文チェックのみを行う。
• 別の構文については何もしない。

19
(とりあえず)完成!
• 実サービスで現在稼働しています。
• パッチを本家に送ってみました。
– マージされれば御の字
https://code.google.com/p/urlrewritefilter/issues/detail?id=1...
まとめ
• 同じ問題に遭遇された方はどうぞ使ってみて
下さい。
– OSSのおかげで自己解決&他者へ貢献出来ました。

• Interpreterの練習が出来ました。
– 実業務ではやったことは無かった。
– プログラミングは実際に書いて動かす...
ご清聴ありがとうございました。

22
Upcoming SlideShare
Loading in …5
×

UrlRewriteFilterに手を入れてみた

1,476 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
  • Be the first to comment

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

×