-
Notifications
You must be signed in to change notification settings - Fork 0
rfc3875
3.4実行
スクリプトは、特に指定しないとき実行可能プログラムとして呼び出される。
サーバーはCGIリクエストを準備する(section4)CGIリクエストはリクエストメタ変数とリクエストメッセージデータを含む。
リクエストデータがスクリプトにすぐに利用可能である必要はありません。(たぶんfastcgiの話)
スクリプトからの応答はsectoin5,6
4.1 CGIリクエスト メタ変数
リクエストに関する情報は2つ、リクエストメタ変数とリクエストメッセージbody
メタ変数には、サーバーから渡されるリクエストに関する情報、システム定義の方法でスクリプトに渡される。(unixは環境変数?)
メタ変数は、大文字と小文字を区別しない名前で識別される。ケースのみが異なる2つの変数は存在しない。
meta-variable-name = "AUTH_TYPE" | "CONTENT_LENGTH" | "CONTENT_TYPE" |
"GATEWAY_INTERFACE" | "PATH_INFO" | "PATH_TRANSLATED" |
"QUERY_STRING" | "REMOTE_ADDR" | "REMOTE_HOST" | "REMOTE_IDENT" |
"REMOTE_USER" | "REQUEST_METHOD" | "SCRIPT_NAME" | "SERVER_NAME" |
"SERVER_PORT" | "SERVER_PROTOCOL" | "SERVER_SOFTWARE" |
scheme | protocol-var-name | extension-var-name
protocol-var-name = ( protocol | scheme ) "_" var-name
scheme = alpha *( alpha | digit | "+" | "-" | "." )
var-name = token
extension-var-name = token
スキームと同じ名前を持つメタ変数、プロトコルまたはスキームの名前で始まるメタ変数も定義されている。
メタ変数はゼロ長と欠損値を区別しない。
その値がNULLのとき、オプション(?)のメタ変数を省略できる。
- AUTH_TYPE HTTPの場合、クライアント要求が外部アクセスに対して認証を要求する場合、サーバーは[Request Authorization Header]フィールドの[Auth-Scheme]トークンからこの変数の値を設定する必要があります。
- CONTENT_LENGTH CONTENT_LENGTH変数には、10進数のオクテット数で、要求に添付されているメッセージ本文のサイズが含まれます。データが添付されていない場合は、NULL(または設定解除)します。リクエストにbodyがあるときのみ、この変数を設定する必要がある。この値は、Content-Encoding, Transfer-Encodingを取り除いた後のbodyの長さにする。
- CONTENT_TYPE Content-Typeフィールドがリクエストヘッダーにあるときはこの値使う。ないときは決定を試みるor省略。他、charsetについていろいろ書いてあるので要再確認。
- GATEWAY_INTERFACE cgiのバージョン。CGI/1.1で良さそう。
- PATH_INFO CGIスクリプトによって解釈されるパス情報。リクエストが~~.cgi/hoge/index.htmlだったら、/hoge/index.htmlの部分。
- PATH_TRANSLATED PATH_INFOのURLが指定するファイルの絶対パス。hostとpath_infoを足したURLが示すファイルのパス。実際にアクセスできる必要はない?PATH_INFOがあるときはこの変数も設定が必要
- QUERY_STRING URLで?以降に指定されるURLエンコードされた文字列。サーバーはこの値を設定する必要あり、指定がないときは空文字列。複合化必要?
- REMOTE_ADDR クライアントのネットワークアドレス。webservならipv4アドレスのはず。
REMOTE_ADDR = hostnumber
hostnumber = ipv4-address | ipv6-address
ipv4-address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
ipv6-address = hexpart [ ":" ipv4-address ]
hexpart = hexseq | ( [ hexseq ] "::" [ hexseq ] )
hexseq = 1*4hex *( ":" 1*4hex )
- REMOTE_HOST 使用可能な場合、クライアントのドメイン名。それ以外の場合、NULL。サーバーはこの値を設定する必要ある。
- REMOTE_IDENT 略
- REMOTE_USER 略
- REQUEST_METHOD スクリプトによって使用されるメソッドに指定される必要あり。(section4.3)大文字小文字区別ある。
REQUEST_METHOD = method
method = "GET" | "POST" | "HEAD" | extension-method
extension-method = "PUT" | "DELETE" | token
- SCRIPT_NAME
// request_targetからファイルのパスだけ取る。
// ex) target: /hoge/test.py script_name: /test.py
- SERVER_PORT サーバーのポート番号
- SERVER_PROTOCOL 基本HTTP/1.1で良さそう?要確認
- SERVER_SOFTWARE サーバーソフトウェアの名前、バージョン。
4.2 リクエストメッセージbody
リクエストデータのアクセスはシステム定義。定義がないかぎり、標準入力もしくはファイル。Content-LengthがNULLじゃないときbodyがある。->Content-Lengthのbyte分読み取る。
サーバーはTransfer-Encodingは取り除いた状態でContent-Lengthを計算する。
section5 NPH scriptsについて
- CGI レスポンス
6.1 応答処理
基本、標準出力を介してレスポンスを受け取る。
サーバーはレスポンスを受け取るまでのタイムアウトを設定することが出来る。
6.2 応答タイプ
レスポンスはメッセージヘッダーとbodyを区切る空行を含む。bodyは空かも。
generic-response = 1*header-field NL [ response-body ]
スクリプトは、文書応答、ローカルリダイレクト応答、またはクライアントリダイレクト(オプションの文書)のいずれかを返す必要があります。
CGI-Response = document-response | local-redir-response | client-redir-response
| client-redirdoc-response
document-response = Content-Type [ Status ] *other-field NL response-body
local-redir-response = local-Location NL
client-redir-response = client-Location *extension-field NL
client-redirdoc-response = client-Location Status Content-Type *other-field NL response-body
6.2.1 document-response
レスポンスの成功ステータスを示すオプションのエラーコードと一緒にドキュメントを返すことが出来る。スクリプトはContent-Typeヘッダーを返す必要ある。ステータスヘッダーはオプション。200は省略可。
6.2.2 Local Redirect Response
Locationヘッダーフィールドの値としてURIパスとクエリ文字列を返す。サーバーへの再処理の要求?
6.2.3 Client Redirect Response クライアントに絶対URIパスを返す。サーバーは302応答を生成する必要あり。
6.2.4 Client Redirect Response with Document
指定したURIを使用してリクエストを再処理する必要があることをクライアントにbldyと一緒に返す。ステータスヘッダーフィールドのが必要302。もしくはリダイレクトを示す拡張ステータスコード。
6.3 Responseヘッダーフィールド
7.システム仕様
unix… メタ変数は同じ名前の環境変数でスクリプトに渡される。getenvもしくはenvironでアクセスされる。スクリプトを実行する作業ディレクトリはスクリプトがあるディレクトリ
文字セットNULを除くUS-ASCII文字セット[9]は、メタ変数、ヘッダーフィールド、およびCHAR値の定義に使用されます。テキスト値ISO-8859-1を使用します。PATH_TRANSLATED値は、NUL以外の8ビットバイトを含めることができます。改行(NL)シーケンスはLFです。サーバーはまた、改行としてCR LFを受け入れる必要があります。