URLParamFilter Version 1.2 内部仕様

APPENDIX

IIS で GET メソッドの引数ではなく URL 自体に値を持たせることを可能にするための ISAPI フィルタです。

URL の文字数制限も可能です。


内部仕様

処理の流れ

初期化

IIS によって URLParamFilter がロードされると、レジストリから初期設定情報を取得します。そして SF_NOTIFY_PREPROC_HEADERS の要求を待ち受けます。

 

要求処理

要求を拾うと、まずはリミッタ処理です。管理者が設定した文字数制限に準じているかを調べます。

文字数制限に違反した場合はフィルタ処理を終了し、管理者の設定によって、途中で切られたままの URL で要求を続行するか、またはあらかじめ定められた URL に変更して処理を続行します。

 

続いて管理者があらかじめ設定した URL かどうかを判定します。

条件に合う URL だった場合は、あらかじめ組み込まれた仕様どおりに URL を分解して環境変数へ保存します。そして、この条件に対応した URL を IIS へ渡します。

条件に合わない URL だった場合は、リミッタ処理を通過した段階の URL をそのまま IIS へ渡します。

 

応答処理

IIS は URLParamFilter から渡された URL をもとに、適切なデータを読み込んでブラウザに返します。

リダイレクト応答ではないので、ブラウザは、URLParamFilter によって URL が変更されたことに気づきません。

 

処理の詳細

リミッタ処理 (文字数制限)

MaxLengthArguments や MaxLengthURL が設定されている場合は、リミッタ処理が行われます。

処理の際に URLParamFilter の内部バッファへ URL を取り込みますが、その時点で URL が入りきらなかった場合は、文字数制限違反となります。その場合、URL は要求されたものではなく、SafeURL に設定された URL へ変更してリミッタ処理を終了ます。

 

内部バッファに収まった場合は、さらに URL のリミッタ処理が行われます。

MaxLengthArguments が設定されている場合は、GET メソッドの引数部分の文字数チェックが行われます。ここでいう GET メソッドの引数部分とは、URL の一番最初に現れる "?" 以降を意味します。

この部分の文字数が MaxLengthArguments に設定された値よりも大きい場合は、リミッタが発動し、越えた部分をカットします。

 

続いて MaxLengthURL が設定されている場合、現時点での (既にカットされている場合もある) URL 全体が MaxLengthURL に指定された文字数よりも大きいかどうかを調べます。

文字数制限をオーバーした場合はリミッタが発動し、それ以上の部分をカットします。

 

通常はこの段階の URL を置き換え処理に渡しますが、例外があります。

SafeMode に 1 が設定されている場合は、文字数制限をオーバーしてリミッタが発動した場合には、URL の置き換え処理は通さずに、SafeURL に指定された URL に置き換えます。

また、リミッタ処理の過程で、URL の文字数が 0 になってしまった場合も、SafeURL に指定された URL が有効に鳴ります。

 

フィルタ処理 (置き換え処理)

置き換え処理に入った時点で、URL の置き換え条件を参照しながら、渡された URL のチェックを行います。

まず SourcePoint として、リミッタ処理を施した URL を読み込みます。内部バッファを越えたなどの理由で有効な SourcePoint が得られなかった場合は、フィルタ処理は行いません。

 

有効な SourcePoint が得られた場合は、まずは要求された URL の拡張子と AcceptType を比較してマッチ判定をするかどうかを判断します。拡張子の条件をクリアしたら、続いてフィルタデータの VirtualPoint にマッチする URL かどうかを判定します。

フィルタデータの判定は先頭から順番に行われ、マッチした時点で、置き換え処理に移ります。置き換えは、マッチした VirtualPoint に対する RealPoint が適用されます。その際に URL を分解して環境変数に保存します。

 

分解処理

URL の分解処理は基本的に、VirtualPoint と一致した部分より後ろに対して行われます。

以降の URL 部分を、 "/" ごとで分解して、それを URLPARAM-OPTIONS という環境変数に保存します。分解されたそれぞれの文字はカンマで区切られます。

そして最後のファイル名の部分は、拡張子を除いたファイル名の部分が URLPARAM-TARGET に格納されます。この際、フィルタデータで Separator が設定されていた場合は、その文字ごとにファイル名を分割して保存します。その場合はそれぞれがカンマで区切られます。

また、拡張子の部分は URLPARAM-TYPE に保存されます。

 

フィルタデータの VirtualPoint でワイルドカードを使用していた場合は、その部分と一致した文字列を URLPARAM-MATCHES に保存します。ワイルドカードを複数回使用していた場合は、カンマ区切りで複数個が保存されます。