Rackの概要、RackミドルウェアとRackアプリケーションの違いについて
この記事はRubyアドベントカレンダーの14日目の記事です。
最近Rackにさわることがあったのでこの記事では
- Rackの概要
- RackミドルウェアとRackアプリケーションの違い
についてまとめます。
Rack概要
RackはWebサーバとRuby及びRubyのフレームワークとの間でやりとりをするためのインタフェースを提供するためのライブラリです。
具体的にはRackは
- Webサーバに来たリクエストを決まったキーを持つハッシュに加工し *1 、そのハッシュを引数にしてRubyで動いているアプリケーションのプログラムを呼び出す
- Rubyのアプリケーションから受け取る
['200', {'Content-Type' => 'text/html'}, ['A barebones rack app.']]
のような形式の配列を加工して、Webサーバが扱う変数に代入する
のはたらきをする Rack ハンドラー 、設定ファイルを読み込み、実行環境に合わせたWebサーバを起動する rackup コマンド、設定ファイルを書く際に利用する Rack::Builder DSL を提供し、
Rackハンドラーから呼び出されるRuby及びRubyのフレームワークのアプリケーションプログラム側には
- ハッシュを引数に
call
メソッドを呼ぶと['200', {'Content-Type' => 'text/html'}, ['A barebones rack app.']]
のような形式のレスポンスを返す
という規約( Rackプロトコル *2 )を守ることを要求します。
この規約に則ったRubyのオブジェクトを Rackアプリケーション と呼びます。
RackアプリケーションとRackミドルウェア
Rackアプリケーションの中には、レスポンスを返すこと自体を目的とせず、Rackアプリケーションの call
メソッドの前後に処理を挟むことを目的として実装される Rackミドルウェア と呼ばれるものがあります。
Rackアプリケーション/Rackミドルウェアと呼ばれるものは両方ともハッシュを引数に call
メソッドを呼ぶと所定の形式の配列を返します。そういう意味ではまとめてRackアプリケーションといえますが、両者には以下のような違いがあります。
- rackupコマンドに与える設定ファイル( config.ru )上で利用を指定するときのDSLが異なる
- Rackアプリケーションは
run Rack::SampleApp
, Rackミドルウェアはuse Rack::SampleMiddleware
で指定
- Rackアプリケーションは
- Rackミドルウェアには追加の規約があり、
1番目の引数に app を受け取る initialize メソッドを定義する
必要がある
Rackミドルウェア(Rackアプリケーション)は自分のコンストラクタに引数として受け取ったアプリケーションに、さらにenvを渡す形で入れ子のように実行していくのですが、最後に実行されるRackアプリケーションを特別に エンドポイント と呼びます。
参考
- https://rack.github.io/
- https://qiita.com/higuma/items/838f4f58bc4a0645950a
- https://qiita.com/k0kubun/items/248395f68164b52aec4a
- http://gihyo.jp/dev/serial/01/ruby/0024
- https://qiita.com/bibio/items/7e45af09f3b8a0146c9e#rack-middleware
*1:リクエストパスは PATH_INFO に入れるなど 詳しくは https://www.rubydoc.info/github/rack/rack/master/file/SPEC
*2:https://www.rubydoc.info/github/rack/rack/master/file/SPEC