CFI スクリプト
CFI スクリプトは、DeleGate 上で転送されるメッセージデータに効かせる ために使うフィルターを選択(データタイプ、サーバー名、クライアントタイプなどにより) する簡単なスクリプトです。 CFI スクリプトは、テキストデータで、 "#!cfi" マジックストリングで始まり、 それぞれ "--" によって区切られた 1つ以上のフィルター設計書を含みます。
CFI script == "!#cfi" NL filterUnit [ "--" NL filterUnit ]* filterUnit == filterRule [ filterRule ]* filterRule == matchingRule | rewriteRule | filterSpec matchingRule == matchingName ":" ruleBody matchingName == MIMEheader | X-header | CGIENV MIMEheader == "Content-Type" | "User-Agent" | ... X-header == "X-Status-Ver" | "X-Status-Code" | "X-Request-Method" | "X-Request-Ver"| "X-Request-URL" | ... CGIENV == "REQUEST_METHOD" | "SERVER_PROTOCOL" | "SERVER_NAME" | "PATH_INFO" | "PATH_TRANSLATED" | "HTTP_USER_AGENT" | ... rewriteRule == Action "/" MIMEheader : ruleBody Action == "Output" | "Remove" filterSpec == filterType ":" ruleBody filterType == "Body-Filter" | "CGI" | "Header-Filter" | "MIME-Filter" | "Message-Filter" ruleBody == string NL [ SP string NL ]*
入力書式:
CFI スクリプトへの入力データは、アプリケーションプロトコル
(HTTP, SMTP, POP, NNTP) の要求/応答ステータス行に先行される、
MIME 書式でのアプリケーションプロトコルメッセージです。
ひとつの MIME メッセージは、空行で分離されたヘッダーとボディからなります。
CFIinputMessage == statusLine MIMEheader NL MIMEbody例) 簡単な HTTP 応答メッセージ
HTTP/1.0 200 OK ... 応答ステータス行 Content-Type: text/html ... ヘッダー Content-Length: 20 ... ヘッダー ... ヘッダー/ボディ 分離行 メッセージボディ ... ボディ
マッチングルール:
matchingRule は、
入力ヘッダーと ruleName:ruleBody を突合わせることを表します。
これは、入力メッセージが ruleBody と一致するフィールドボディを
ともなう ruleName ヘッダーを持つときに一致します。
1つ以上のルールが一致した場合、
真になり、filterUnit が採用されます。
filterUnit 内に突き合わせルールが存在しない場合、
filterUnit は、無条件に採用されます。
現在、限られた MIME ヘッダーセット (要求・応答メッセージ中の) のみが
突き合わせに使用できます。
オリジナルヘッダー中に含まれないいくつかの
拡張ヘッダー情報で突き合わせることもできます。
(例: 応答メッセージ中の状態コードを意味する "X-Status-Code")
CGI
環境変数とのマッチング。
例) マッチングルール
書換えルール:
"Action/" が前置された rewriteRule がある
ruleName:ruleBody は、
関連する ruleName フィールドのための ruleBody データを
使ういくつかの単純な書換えを指定します。
"Output/ruleName:ruleBody" は、
ヘッダーに ruleName:ruleBody フィールドを追加 (または置換)
するということです。
"Remove/ruleName:ruleBody" は、
名前が ruleName で ruleBody と一致するボディを持つ、
ヘッダーフィールドを削除することを表します。
フィルター指定:
filterSpec は、入力データに効かせるフィルターを指定します。
入力メッセージ全体または一部はフィルタープログラムの標準入力へ渡され、
標準出力からのメッセージが元の入力メッセージの代わりに、
対象(クライアントや、サーバー)に転送されます。
Body-Filter: MIMEbody 用フィルター CGI: MIMEbody 用フィルター Header-Filter: MIMEheader 用フィルター MIME-Filter: MIMEheader + MIMEbody 用フィルター Message-Filter: statusLine + MIMEheader + MIMEbody 用フィルター全ての種類のフィルターには、CGI 環境変数が渡されます。 加えて、CFI を起源とする環境変数も渡されます( "SERVER_HOST" (対象サーバー名), "REQUEST_URL" (要求 URL))。
"Body-Filter" や "CGI" のフィルターのために, 転送メッセージ中の "Content-Length" ヘッダーは、フィルター後のボディ部分のサイズを示すように 調整されます。 "CGI" フィルターの出力は、CGI 出力 のステータスヘッダーに先行されていなければなりません。
"Header-Filter" フィルターの場合、 メッセージのヘッダー部はフィルターに渡されます。 HTTP メッセージ (Request-Line または、Status-Line) 中の start-line は、 "Request-Line:" または、"Status-Line:" を 前置きされたヘッダーフィールドとして、渡されます。
"MIME-Filter" のフィルターでは、ヘッダーとボディからなる MIME メッセージ全体が、 フィルターとやりとりされます。
"Message-Filter" のフィルターでは、 アプリケーションプロトコルのメッセージ全体がフィルターとやりとりされ、 それぞれのメッセージは、アプリケーションプロトコルの要求/応答ステータスを 表す 1行を最初に持つ MIME メッセージで構成されます。
例) HTTP 応答メッセージの書換え
例) 利用可能なヘッダーと環境変数を表示する