Rack::Adapterを調べてみる

Rackのアダプタ(Rack::Adapter)は、アプリケーションというか、ミドルウェアじみたものなんだろうか?

インターフェースを規定した抽象クラスでもあるのかと思ってたわけですが、ネームスペース確保のため(?)に空モジュールが定義されているだけの様子。

それなら、ハンドラ(Rack::Handler)はどうかと思ってみて見ると、2つのクラスメソッドが定義されていて、後は実装済みハンドラのロードと登録をしているだけ。クラスメソッドも、サーバ名を指定してクラスを取得するgetと、サーバ名に紐づけたクラスを登録するregisterのみ。

と思えば、ハンドラはコメントに振る舞いが書かれていますね。アプリケーションを第1引数にとるrunメソッドの呼び出しで活動する様です。任意で、第2引数としてサーバ固有の設定情報などが納められたHashオブジェクトをとるようです。rackupのソースを見ても、最後に"server.run app, options"とあり、振る舞いベースですぐに実装方法がわかるので困りませんね。

さて、アダプタは結局どうしたらいいのでしょうか。同梱されたRack::Adapter::Campingを見る限り、アプリケーションを引数にとるinitializeと、外部から呼ばれるであろうcallメソッドが実装されています。callメソッドは、アプリケーション同様にenvを引数にとります。引数にとったアプリケーションの実行前に、envのセットアップ(CGI環境変数のセットなど)をし、実行後にヘッダの調整をして、Rackプロトコルに従ったレスポンスを返しています。落ち着いてみれば、結局振る舞いベースで仕様が分かった様な気がします。とりあえず、アプリケーションをラップするミドルウェア的なものだと考えておきます。

まあ、アダプタなので、hogeとfooを繋ぐ役割を果たせればよいわけで、Rackの流儀に則るために前後の処置をするだけのミドルウェア(アプリケーション)として実装すればよいわけですね。名前から分かれよ、と自分に言っておきます。

以上をふまえて、どうもssbで無理矢理Rack対応させたコードは(方針的に)よろしくないのではと思い、Rack::Adapter::SSBとして実装してみました。以前と別のファイル(libs/rack/adapter/ssb.rb)にしてみました。が、config.ruをいじってしまったので、微妙なコミットになった気がします。Rack関連で汚らしいコミットをしてしまってい、申し訳ありません。

そんなこんなで、ソースは以下。先述の通り、CodeReposにコミットしてしまっています。

フレームワークでもないのに、アダプタを用意する必要があるのか分かりませんが、システムを汚さないという意味で、多少は意味があるかなと思いやってしまいました。9割以上は興味本意ですが。


多分、もうしばらくはRackネタが(散発的にでも)続くと思います。

プロフィール

このブログ記事について

このページは、koshigoeが2008年9月10日 22:35に書いたブログ記事です。

ひとつ前のブログ記事は「Rack解説を試みて失敗しつつも晒す、の巻」です。

次のブログ記事は「"~>"という演算子の意味」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。