SlideShare a Scribd company logo
1 of 22
Download to read offline
UrlRewriteFilterに
手を入れてみた
福原和朗
2013-11-16

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

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

• アクシオヘリックス(株)
– http://www.axiohelix.com/
• 開発案件あれば、ご連絡ください。
• エンジニア募集しています。
2
UrlRewriteFilter
• リクエストのURLを書き換えるライブラリ
– 外向きには綺麗なURLを提示し、内部ではフレー
ムワーク標準に合うURLが使えるようにする。
– http://tuckey.org/urlrewrite/
http://example.org/repo/data/123/なんとかかんとか

http://example.org/repo/data/get.do&id=123
3
事の発端
• 利用者から障害報告が来ました。
– バージョン3系から4系に上げた後。
利用者からのメール引用

以下をダウンロードしようとしたところ
ページにアクセスできません
とエラーとなりました。ご確認いただけますと幸いです。
http://example.org/download/data1234/link/datafile.xls

4
3系と4系の違い
• URL変換の指定と実際の動作を調べてみた。
実際に変換の指定をしているところ

<to>/file/download.action?workId=$1&amp;fileTyp
e=${escape:$2}&amp;fileName=${escape:$3}&amp
;originalUrl=%{request-url}</to>

• ${...} の部分の括弧対応がおかしい。
– それぞれ処理されるべきだが全体で一括で処理
されている。
5
${...} とは何か
• 関数
– ${<関数名>:<引数>:...} というような形
– escape , replaceなど色々
${upper:hello}

HELLO

${trim:

nantoka

nantoka }

http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#functions
6
関数が複数あるとき
• 関数の連続はNG
"a${upper:hoge} ${lower:fOObAR} b "
"aHOGER} ${LOWER:FOOBAR b"
この部分が無視される

• 関数の入れ子はOK
"a${trim:AbCd ${lower:fOObAR} 1234 } b "
"aAbCd foobar 1234 b“

7
既に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} 1234
10
やりたいこと
• 関数が続いていても入れ子でも動作すること
"a${upper:hoge} ${lower:fOObAR} b "
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

• 設定を木構造として解釈できればよい。
11
木構造として解釈
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

‘b ’

関数

‘a’

関数パラメータ

関数名 ‘trim’

‘AbCd ’

関数名 ‘lower’

関数

‘ 1234 ’

関数パラメータ
‘fOObAR’

12
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> :== ${ <functionContent> }
<functionContent> :== <functionName> : <param>
<param> :== <element> * | <element> * : <param>
<functionName> :== replace | replaceAll | replaceFirst | escape | escapePath | lower |
upper | toLower | toUpper | trim | length

${ , } , : が、文法上意味を持つ。これ重要!!
16
トークン化クラス
• ${ } : を基準に文字列を切り分ける。
a${trim:AbCd ${lower:fOObAR} 1234 } b

a

${

trim

:

AbCd

${

lower

:

fOObAR

}

1234

}

b

17
ノードを表すクラス
例:関数の中身を表現する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
Interpreterをやってみた印象
• それぞれの役割がはっきりしている
– トークナイザはただ区切って出すだけ。
– 各々のノードが各々の構文チェックのみを行う。
• 別の構文については何もしない。

19
(とりあえず)完成!
• 実サービスで現在稼働しています。
• パッチを本家に送ってみました。
– マージされれば御の字
https://code.google.com/p/urlrewritefilter/issues/detail?id=120#c4

• ビルド済みjarファイル公開しています。
http://www7b.biglobe.ne.jp/~archer/urlrewritefilter/issue120.html

20
まとめ
• 同じ問題に遭遇された方はどうぞ使ってみて
下さい。
– OSSのおかげで自己解決&他者へ貢献出来ました。

• Interpreterの練習が出来ました。
– 実業務ではやったことは無かった。
– プログラミングは実際に書いて動かすのが重要。

21
ご清聴ありがとうございました。

22

More Related Content

More from Kazuro Fukuhara

トーナメントは運か実力か
トーナメントは運か実力かトーナメントは運か実力か
トーナメントは運か実力かKazuro Fukuhara
 
nextProbablePrime() について
nextProbablePrime() についてnextProbablePrime() について
nextProbablePrime() についてKazuro Fukuhara
 
素数のハニカム螺旋
素数のハニカム螺旋素数のハニカム螺旋
素数のハニカム螺旋Kazuro Fukuhara
 
日本語によるJUnitの拡張について
日本語によるJUnitの拡張について日本語によるJUnitの拡張について
日本語によるJUnitの拡張についてKazuro Fukuhara
 
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案Kazuro Fukuhara
 
Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記Kazuro Fukuhara
 
OWLで何が言えるか
OWLで何が言えるかOWLで何が言えるか
OWLで何が言えるかKazuro Fukuhara
 
記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったこと記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったことKazuro Fukuhara
 
OWLで何が書けるか
OWLで何が書けるかOWLで何が書けるか
OWLで何が書けるかKazuro Fukuhara
 

More from Kazuro Fukuhara (10)

トーナメントは運か実力か
トーナメントは運か実力かトーナメントは運か実力か
トーナメントは運か実力か
 
nextProbablePrime() について
nextProbablePrime() についてnextProbablePrime() について
nextProbablePrime() について
 
素数のハニカム螺旋
素数のハニカム螺旋素数のハニカム螺旋
素数のハニカム螺旋
 
日本語によるJUnitの拡張について
日本語によるJUnitの拡張について日本語によるJUnitの拡張について
日本語によるJUnitの拡張について
 
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案
 
Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記
 
OWLで何が言えるか
OWLで何が言えるかOWLで何が言えるか
OWLで何が言えるか
 
資格四方山話
資格四方山話資格四方山話
資格四方山話
 
記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったこと記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったこと
 
OWLで何が書けるか
OWLで何が書けるかOWLで何が書けるか
OWLで何が書けるか
 

Recently uploaded

20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (8)

20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

UrlRewriteFilterに手を入れてみた