FrontPage  Index  Search  Changes  RSS  Login

[Ruby] Rackプロトコル仕様

概要

Rack provides an minimal interface between webservers supporting Ruby and Ruby frameworks.
RackはRubyをサポートするウェブサーバ群とRubyフレームワークとの間の最小のインターフェースを提供する。

プロトコル仕様

この仕様はRackプロトコルの形式化を目的とする。あなたは、そのためにRack::Lintを適用する事ができる(そしてそうすべき)。あなたがミドルウェアを開発する際、必ずすべての誤りを捕捉する前後にLintしなさい。

Rackアプリケーション

Rackアプリケーションはcallに応えるRubyオブジェクト(classではない)。それは1つの引数environmentをとり、3つの値(statusheadersbody)を持つArrayを返す。

Environment

環境変数(environment)はCGIのようなヘッダを含むハッシュ(サブクラスは許可しない)のインスタンスでなければならない。アプリケーションは環境変数を自由に変更する。環境変数はこれらの変数(PEP333により採用された)が、空である場合を除いて、含む事が要求される。

REQUEST_METHOD

"GET"か"POST"である、HTTPリクエストメソッド。これは常に必須で、空の文字列である事も許されない。

SCRIPT_NAME

アプリケーションオブジェクトに該当するリクエストURLの"path"の初期割当で、そのためアプリケーションはその仮想"location"を知っている。もしアプリケーションがサーバの"root"に該当するなら、これは空の文字列かもしれない。

PATH_INFO

リクエストの対象となるアプリケーションの仮想"location"を指定した、リクエストURLの"path"の余り。もしリクエストURLがアプリケーションルートを指し、スラッシュがないなら、これは空の文字列かもしれない。

QUERY_STRING

リクエストURLの一部で、?以降。空かもしれないが、これは常に必須。

SERVER_NAME, SERVER_PORT

SCRIPT_NAMEPATH_INFOと一緒に結合させ、URLの補完に使われる事がある。ただし、HTTP_HOST'があるなら、リクエストURLを復元するためにSERVER_NAMEより優先して使うべきだという事に注意すること。SERVER_NAMESERVER_PORTは空の文字列になる事はなく、常に必須。

HTTP_*

クライアントが与えたHTTPリクエストヘッダに該当する変数(変数名はHTTP_で始まる)。これら変数のありなしはリクエストのHTTPヘッダのありなしに一致する。

これに追加して、Rack環境変数はこれらRack固有の変数を含まなければならない。

rack.version

Rackのバージョンを表現する[0,1]のようなArray。

rack.url_scheme

リクエストURLに依存するhttphttps

rack.input

以降の入力ストリームに関する記述を参照。

rack.errors

以降のエラーストリームに関する記述を参照。

rack.multithread

アプリケーションオブジェクトが同じプロセスの中の別スレッドによって同時に呼び出されたならtrueで、そうでなければfalse。

rack.multiprocess

同じアプリケーションオブジェクトが異なるプロセスによって同時に呼び出されたならtrueで、そうでなければfalse。

rack.run_once

アプリケーションがプロセスが生存する間に1度だけ呼び出されるだろう事を、サーバが期待(しかし保証しない)するならtrue。通常、これはCGI(もしくは同様のもの)ベースのサーバでだけtrueとなる。

サーバかアプリケーションは自身のデータも環境変数に格納できる。キーは1つのドットを含まなければならず、ユニークなプレフィックスを持つべき。プレフィックスrack.はRackコアディストリビューションの為に予約済みで他の事に使ってはならない。環境変数はHTTP_CONTENT_TYPEHTTP_CONTENT_LENGTHというキーを含んではならない(HTTP_なしのバージョンを使う)。CGIキー(ピリオドなしの名前)はStringの値を持たなければならない。これらは次の制約を持つ:

  • rack.versionは整数値を持つ配列でなければならない
  • rack.url_schemehttphttpsのどちらかでなければならない
  • rack.inputとして有効な入力ストリームがなければならない
  • rack.errorsとしてエラーストリームがなければならない
  • REQUEST_METHODGET, POST, PUT, DELETE, HEAD, OPTIONS, TRACEのいずれかでなければならない
  • SCRIPT_NAMEが空でないなら、"/"から始まらなければならない
  • PATH_INFOが空でないなら、"/"から始まらなければならない
  • CONTENT_LENGTHが与えられたなら、数値のみで構成されなければならない
  • SCRIPT_NAMEPATH_INFOのどちらか1つがセットされていなければならない。SCRIPT_NAMEが空ならPATH_INFOは"/"であるべき。SCRIPT_NAMEは"/"でなく、代わりに空であるべき

入力ストリーム

入力ストリームはgets, each, readに応答しなければならない。

  • getsは引数なしで呼ばれ、文字列かEOFを意味するnilを返さなければならない
  • readは引数なしか1つの整数を引数にとって呼ばれ、文字列かEOFを意味するnilを返さなければならない
  • eachは引数なしで呼ばれ、Stringのyieldでなければならない
  • closeは入力ストリームで呼ばれてはならない

エラーストリーム

エラーストリームはputs, write, flushに応答しなければならない。

  • putsto_sに応答できる1つの引数をとって呼ばれなければならない
  • writeはStringである1つの引数をとって呼ばれなければならない
  • flushは引数なしで呼ばれなければならず、エラーを確実に明らかにするために呼ばれなければならない
  • closeはエラーストリームで呼ばれてはならない

レスポンス

ステータス

整数(to_i)としてパースされるステータスで、100以上でなければならない。

ヘッダ

ヘッダはeachに応答しキーと値をyieldしなければならない。ヘッダのキーはStringでなければならない。

ヘッダは

  • Statusキーを含んではならない
  • キー自身に":"や改行を含んではならない
  • キー自身が"-"や"_"で終わってはならない
  • キーは、レター、数値、"_"、"-"のみで構成されレターで始まらなければならない

ヘッダの値はeachに応答しなければならない。eachされる値はStringでなければならず、037以下の文字を含んではならない。

Content-Type

Statusが204か304の場合をのぞいて、Content-Typeはなければならなない。例外のケースでは何も与えてはならない。

ボディ

ボディはeachに応答しなければならず、その場合String値をyieldするだけでなければならない。もしBodyがcloseに応答するなら、イテレーションの後に呼ばれるだろう。ボディは一般にStringかアプリケーションインスタンス自身かFileに見えるオブジェクトの配列である。

謝辞

Some parts of this specification are adopted from PEP333: Python Web Server Gateway Interface v1.0 (www.python.org/dev/peps/pep-0333/). I‘d like to thank everyone involved in that effort.

Last modified:2008/09/06 20:59:48
Keyword(s):[ruby] [rack]
References: