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ネタが(散発的にでも)続くと思います。

