Framework(以後WAFと略す)がたくさんあって、確実にその流れに乗った方がよいケースがほとんどです。いわゆる「オレオレ」なWAFを「車輪の再発明」と認識しながらつくると世の中のWAFが内部的にどーなってんのかを理解しやすくなったりします。WAFに必要な個別の要素が浮き彫りになるので、何かあった時にどこが問題か?といった切り分けや、少ない機能を提供するだけのサービスをつくる際にオリジナルのWAFで高速化や効率化を図るなどが出来るかもしれません。本記事では、割りと散々出尽くされている感はありますが、全体で100行程度の非常にシンプルなWAFをつくる過程を紹介してみます。オレオレWAFを実践で使うことを推奨しているわけではない。いうのを断りとして最初に入れておきます。最低限のコンポーネント今回試作したWAFの機能は最低限となっているので以下のパーツを組み合わせる形で実装出来ました。処理し、Perlの場合PSGIハンドラを返し、Webアプリサーバとつなぐところリクエストメソッド及びパスを加味し適切なコントローラのアクションへディスパッチするRouterViewのレンダリングメソッドを持ったControllerこれらに肉付けしていくとより高機能で実用的な要求に耐えうるものが出来るでしょう。以下のモジュールで形成されています。Kirino.pmKirino/Controller.pmKirino/Router.pm例えば、MyAppという名前のWebアプリをKirinoを使ってつくる場合、以下のようなディレクトリ構成例になります。テンプレートファイル継承ベースでKirinoを使う感じですね。MyApp先に使い心地を見てもらうために上記で紹介したMyAppの実装を見てみましょう。フォームに入力した値がサブミットされると表示されるという非常に単純なものです。ルーティングルールをstartupメソッドの中で記載します。});}1;この場合「/echoというパスにGETメソッドが飛んできたらRootというコントローラークラスのechoメソッドが発火される」という意味です。今のところGET以外にPOSTにも対応しています。Rootコントローラーを見てみましょう。}1;Kirino::Controllerを継承することで$selfにRequestオブジェクトを取得するreqメソッドが生えているのでそれを利用してクエリーパラメータを取得し、値をレンダリングの際に渡しています。その際使うテンプレートファイルであるecho.txはこちら。部分で値を展開しているのが分かります。Kirinoはこのような使い勝手の最低限のWAFとなっておりまして、多数の問題やら課題があるものの、上記のMyAppは正常に動くし、記述もある程度スッキリ書けますね。コードでは、そのKirinoのコードをコメントとともにベタっと貼ってみましょう。Kirino.pmから。モジュールはRouter::BoomというCPANライブラリを活用し、get及びpostメソッドを生やしているだけです。@_);}__PACKAGE__->meta->make_immutable();また、コントローラーはリクエストオブジェクトを扱うテンプレートと共にレンダリングをしHTMLを返却するという機能のみが実装されています。];}__PACKAGE__->meta->make_immutable();以上3つのファイル、合計100行程度で、簡単なWAFが完成しました。エラーハンドリングなどあえてしていない部分が多数あるので、改善の余地はありますが、WAFに必要な最低限の要素が分かってきます。ちなみに今回はPerlで実装し、以下のCPANモジュールを利用しました。MousePath::TinyPlackRouter::BoomText::Xslateってことで、何度目かわからないほどのWAFの再発明でした。Kirinoについてはは以下のGitHubレポジトリに雑な感じで置いてあるのでご参照下さい。