[CTX] [ALL] CFI script

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 応答メッセージ

マッチングルール:
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" は、 名前が ruleNameruleBody と一致するボディを持つ、 ヘッダーフィールドを削除することを表します。

フィルター指定:
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 応答メッセージの書換え

例) 利用可能なヘッダーと環境変数を表示する