翻訳: 桑田誠
〔訳注: 本稿は http://rack.rubyforge.org/doc/SPEC.html の翻訳です。〕
This specification aims to formalize the Rack protocol. You can (and should) use Rack::Lint to enforce it. When you develop middleware, be sure to add a Lint before and after to catch all mistakes.
本仕様は、Rack プロトコルを形式的に定義することを目的としている。Rack::Lint を使うと (ぜひ使うべきだ)、仕様に従うことを強制できる。ミドルウェアを開発するときは、ミスをすべて捕捉するために Lint を前後に付け加えるようにすること。
A Rack application is an Ruby object (not a class) that responds to call. It takes exactly one argument, the environment and returns an Array of exactly three values: The status, the headers, and the body.
Rack アプリケーションは、call() メソッドが呼び出せる Ruby のオブジェクトである (クラスではない)。call() は「環境 (environment)」を表す引数を 1 つだけとり、「ステータス」「ヘッダ」「ボディ」の 3 つを要素とする配列 (Array) を戻り値として返す1。
The environment must be an instance of Hash that includes CGI-like headers. The application is free to modify the environment. The environment is required to include these variables (adopted from PEP333), except when they’d be empty, but see below.
環境 (environment) は CGI ライクなヘッダを持った Hash のインスタンスオブジェクトである。アプリケーションは好きなように環境を変更してよい。環境は以下のような変数を含む必要がある (これは PEP3332 に倣った)。ただし値が空である場合は含まなくてもよい。
In addition to this, the Rack environment must include these Rack-specific variables:
これらに加え、Rack の環境は以下のような Rack 特有の変数を含なければならない。
Additional environment specifications have approved to standardized middleware APIs. None of these are required to be implemented by the server.
これらに加え、以下のような付加的な環境が標準ミドルウェア API において承認されている。サーバはこれらを実装する必要はない。
The server or the application can store their own data in the environment, too. The keys must contain at least one dot, and should be prefixed uniquely. The prefix rack. is reserved for use with the Rack core distribution and other accepted specifications and must not be used otherwise. The environment must not contain the keys HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH (use the versions without HTTP_). The CGI keys (named without a period) must have String values. There are the following restrictions:
サーバまたはアプリケーションは、独自のデータも環境に追加できる。キーは最低限 1 つのピリオドを含まなければならず、接頭辞は一意に識別されるべきである。接頭辞「rack.」は Rack コアおよび他の受理された仕様のために予約されており、他の目的で使ってはならない。環境は「HTTP_CONTENT_TYPE」または「HTTP_CONTENT_LENGTH」を含んではいけない (かわりに「HTTP_」を取り除いた名前を使う)。CGI キー (ピリオドなしの名前) は文字列の値を持たなければならない。そのほか以下のような制限事項がある:
One of SCRIPT_NAME or PATH_INFO must be set. PATH_INFO should be / if SCRIPT_NAME is empty. SCRIPT_NAME never should be /, but instead be empty.
The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to gets, each, read and rewind.
入力ストリーム (input stream) は IO に似たオブジェクトであり、HTTP POST の生データを保持している。もし適用可能であれば、その外部エンコーディングは「ASCII-8BIT」でなければならず、バイナリモードでオープンされてないといけない (これは Ruby 1.9 との互換性のためである)。入力ストリームは gets() と each() と read() と rewind() を実装していなければならない。
close must never be called on the input stream.
The error stream must respond to puts, write and flush.
エラーストリームは puts() と write() と flush() を実装しなければならない。
close must never be called on the error stream.
This is an HTTP status. When parsed as integer (to_i), it must be greater than or equal to 100.
HTTP ステータスを表す。整数としてパースされた場合 (to_i)、100 以上でなければならない。
The header must respond to each, and yield values of key and value. The header keys must be Strings. The header must not contain a Status key, contain keys with : or newlines in their name, contain keys names that end in - or _, but only contain keys that consist of letters, digits, _ or - and start with a letter. The values of the header must be Strings, consisting of lines (for multiple header values, e.g. multiple Set-Cookie values) separated by “n”. The lines must not contain characters below 037.
ヘッダは each() を実装し、キーと値の組を yield しなければならない。ヘッダのキーは文字列でなければならない。ヘッダは「Status」キーを含んではならない。また名前に「:」や改行があるキーや、「-」や「」で終わるようなキーを含んでもいけない。キーは文字4と数字と「」と「-」のみで構成され、文字で始まらなければならない。ヘッダの値は文字列でなければならない。値は複数行である場合もあり (これは値が複数であるヘッダのため、たとえば Set-Cookie を複数回指定した場合など)、その場合は「\n」で区切られてなければならない。行は 037 より小さい文字5を含んではならない。
There must be a Content-Type, except when the Status is 1xx, 204 or 304, in which case there must be none given.
「Content-Type」は、ステータスが「1xx」「204」「304」のときは何も指定されてはならず、それ以外のときは必ず指定されなければならない。
There must not be a Content-Length header when the Status is 1xx, 204 or 304.
「Content-Length」ヘッダは、ステータスが「1xx」「204」「304」のときは何も指定されてはならない。
The Body must respond to each and must only yield String values. The Body itself should not be an instance of String, as this will break in Ruby 1.9. If the Body responds to close, it will be called after iteration. If the Body responds to to_path, it must return a String identifying the location of a file whose contents are identical to that produced by calling each; this may be used by the server as an alternative, possibly more efficient way to transport the response. The Body commonly is an Array of Strings, the application instance itself, or a File-like object.
ボディは each() を実装し、文字列のみを yield しなければならない。ボディ自体は文字列であってはならない (なぜなら Ruby 1.9 では動かないから6)。もしボディが close() を実装している場合は、繰り返しのあとで呼び出される。ボディが to_path() を実装している場合は、to_path() はファイルの場所を表す文字列を返さなければならず、そのファイルの内容は each() を呼び出しているときに生成される; この方法は、サーバによってはレスポンスを効率よく転送するための代替手段として使われることがある。ボディは、通常は文字列を要素とした配列か、アプリケーションインスタンスそのものか、ファイルに似たオブジェクトである。
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.
本仕様のいくつかの部分は、PEP333: Python Web Server Gateway Interface v1.07 (www.python.org/dev/peps/pep-0333/) から取り込まれた。その仕様策定に尽力された方全員に感謝の意を表する。
桑田誠。 『新・のび太と鉄人兵団』はドラえもん映画としてひさびさの傑作。ネットでの評判も高いので、見てない人はぜひ。
訳注: call() が引数として受け取る Hash オブジェクトが HTTP リクエストを表し、戻り値である配列が HTTP レスポンスを表す。 ↩
訳注: 「PEP333」とは、Rack のもとになった Python WSGI の仕様のこと。「PEP」とは「Python Enhancement Proposals」のことで、その中の番号 333 が WSGI である。Rack は WSGI をうまく Ruby 流にアレンジしており、結果として WSGI よりわかりやすくなっている (高階関数を使うかわりに戻り値を配列にするなど)。 ↩
訳注: つまりサーバプロセスが複数あれば true になる。通常は true。 ↩
訳注: 原文は「letters」だがおそらくアルファベット限定。 ↩
訳注: アスキーコードで「037 より小さい文字」は制御文字にあたる。なお 037 も制御文字なので、正確には「アスキーコードで 037 以下の文字」が正しい。 ↩
訳注: String#each() は Ruby 1.9 で削除された。 ↩
訳注: WSGI (Web Server Gateway Interface) の最新仕様は WSGI v1.0.1 である。実は Python 3 では WSGI v1.0 がうまく動作しないため、v1.0.1 ではそれへの対応がなされている。なお Python 3 の登場を機に、Rack の仕様を一部取り込んだ Web3 という仕様が WSGI の後継として提案されたが、より保守的な WSGI v1.0.1 が登場したため、Python 3.2 ではそちらが採用された。 ↩