If:

If: ヘッダー (HTTP)

[41] If: ヘッダーは、状態トークンと実体タグによって要求の適用条件を指定するものです。

仕様書

意味

[10] If: ヘッダーは、 トークンと実体タグが特定の資源と一致するかどうかの条件の状態リストを指定して要求を条件付きとするために使うことができます >>8。

[11] If: ヘッダーは、 状態トークンを指定して、クライアントが状態トークンについての知識を有することを示すためにも使うことができます >>8。 状態トークンを If: に指定することを提出 (submit) といいます >>1, >>8。

[2] その意味は状態トークンの種類によって異なります >>8 が、 ロックトークンの場合、クライアントの principal がロックを有すると表明することとなります。

[12] >>10 と >>11 は同じヘッダーに記述されますが、別々に処理されます。 状態トークンが提出されたとみなすかどうかと、 状態トークンが含まれる状態リストを鯖が実際に評価したか否かや、 含まれる条件が真に評価されるか否かは、独立しています >>8。

構文

[15] If: ヘッダーの値は、 1つ以上のタグ無しリストの OWS 区切りのリスト、 または1つ以上のタグ付きリストの OWS 区切りのリストです >>8。

  1. |
    1. =
      1. タグ無しリスト
      2. *
        1. OWS
        2. タグ無しリスト
    2. =
      1. タグ付きリスト
      2. *
        1. OWS
        2. タグ付きリスト
タグ付きリストとタグ無しリストを混在させることはできません。

[24] If: ヘッダーは、含まれるタグ付きリストやタグ無しリストのいずれかが真と評価されるなら全体として真であり、 すべてが偽と評価されるなら全体として偽となります >>8。

[16] タグ無しリストは、1つ以上の条件を ( と ) で括ったものです >>8。条件の前後には OWS を挿入できるようです。

  1. (
  2. OWS
  3. 条件
  4. *
    1. OWS
    2. 条件
  5. OWS
  6. )

[17] タグ付きリストは、1つ以上のタグ無しリストの前に資源タグを置いたものです >>8。 資源タグの後やリスト間には OWS を挿入できるようです。 資源タグは、単純参照を < と > で括ったものです >>8。

  1. <
  2. 単純参照
  3. >
  4. OWS
  5. リスト
  6. *
    1. OWS
    2. リスト

[20] タグ付きリストは、リストが資源タグの URL についてのものであることを表しています。 タグ無しリストは、リストが要求URLについてのものであることを表しています。 >>8

[22] タグ付きリスト内の各リストやタグ無しリストは、 含まれる条件がすべて真であるなら全体として真で、 偽のものがあるなら全体として偽となります >>8。

[23] タグ付きリストは、含まれるリストのいずれかが真であるなら全体として真で、 すべて偽であるなら全体として偽となります >>8。

[18] 条件は、状態トークンか実体タグか、それらの前に Not を置いたものです。 状態トークンは絶対URLを < と > で括ったものです。 実体タグは [ と ] で括ります。 Not は大文字・小文字不区別です。 >>8 Not の前後には OWS を挿入できるようです。

  1. ?
    1. Not
    2. OWS
  2. |
    1. =
      1. <
      2. ASCII絶対URL
      3. >
    2. =
      1. [
      2. 実体タグ
      3. ]
[19] 絶対URLの定義としては RFC 3986 absolute-URI が参照されています >>8。

[21] Not は条件の否定を表しています >>8。

文脈

[34] 任意の要求が If: ヘッダーを含めることができます >>33。

[6] 変更される資源が複数ある場合は、関係するすべてのロックのロックトークンを提出しなければなりません >>5。

[7] 例えば移動時に移動元と移動先の両方がロックされているなら、 両方のロックトークンが必要です >>5。

[4] 変更しようとする資源がコレクションのメンバーとして間接的にロックされている時は、 (直接のロックとは別に) コレクションのロックトークンも指定する必要があります >>3。

[39] ロックを更新するために LOCK 要求に If: ヘッダーを指定することができます。その場合、 ロックトークンは1つだけ指定しなければなりません。 >>38, >>37

[29] WebDAV に対応しない串は If: を扱えないでしょうから、 HTTP/1.1 串への要求には Cache-Control: no-cache を、 HTTP/1.0 串への要求には Pragma: no-cache を含めなければなりません >>8。 一般に WebDAV に対応していない串を判定する信頼できる方法はありませんから、 常に指定するのが良い (advised) >>8 とされています。

処理

[14] If: ヘッダーが偽と評価された場合には、 412 応答を返して失敗としなければなりません >>8, >>33。 そうでない場合には、 If: ヘッダーが無かった場合のように処理を続行できます >>8。

[25] 実体タグは、指定された資源の実体タグと (強い比較または弱い比較で) 一致するかどうかを評価します >>8。

[26] 状態トークンは、指定された資源に関する状態トークンと完全一致で比較します。 ロックトークンの場合には、資源がロックの適用範囲内にあれば一致とします。 >>8

[27] なお指定された資源が写像されていない URL の場合には、 実体タグも状態トークンも一致しないものとします >>8。

[28] ロックの適用範囲内となる場合でも特別扱いはしていないようです。

[13] 関係するすべてのロックのロックトークンが指定されなかった場合は、 変更操作が失敗しなければなりません。 >>5

[40] LOCK 要求に If: が指定された場合で対象資源がその範囲内にない場合には、 412 応答を返すことができます。 応答には事前条件符号 lock-token-matches-request-uri を指定できます。 >>37

歴史

[36] IANA登録簿は RFC 4918 が出典に更新されています >>35。

例

[30]

If: (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>
  ["I am an ETag"])
  (["I am another ETag"])
... は、
... のいずれかであることを求めています >>8。

[31]

If: (Not <urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>
  <urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092>)
... は、1つ目の URL のロックの対象ではなく、かつ 2つ目の URL のロックの対象であることを求めています >>8。

[32]

If: (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)
  (Not <DAV:no-lock>)
... は、 DAV:no-lock がロックトークンとして使われることのない URL であり、その否定形は常に真となるため、ヘッダー全体として常に真に評価されます。 ロックがタイムアウトで無効となっても失敗せずに処理を続けさせたい場合にこのような指定が有用です。 >>8

関連

[9] If-Match: ヘッダーと似ていますが、 If: ヘッダーには実体タグの他に状態トークンも指定できる点が違っています。

[42] サポート切れの「IIS 6」でリモートから任意のコードが実行できるという脆弱性が発見される | スラド セキュリティ () <https://security.srad.jp/story/17/04/05/0637251/>