0
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に手を入れてみた

814

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
814
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×