サーバーは、If-MatchのETagが一致したときだけ書き込みを適用する
クライアントは、リソースを読み取ったとき、その時点のETagを受け取ります。書き込むときは、そのETagをIf-Matchヘッダーに入れて送り、リソースが読み取った時点のままである場合に限って、書き込みを求めます。
読み取り時点から何も変わっていなければ、リソースの現在のETagは一致します。この場合、サーバーは、書き込みを通常どおり適用します。
その間に別の書き込みが起きていれば、リソースの現在のETagは一致しません。この場合、サーバーは、書き込みを適用せず、412 Precondition Failedで拒否します。
この仕組みによって、サーバーは、2人目の書き込み者が1人目の変更を上書きしてしまうのを防げます。どちらの書き込み者も、自分が読み取ったバージョンに書き込んでいるつもりでいるため、この衝突には気づけません。
この課の目標
If-MatchとETagがどう更新の消失を防ぐかを説明できる。412 Precondition Failedが何を示すか説明できる。
2つのクライアントが、ETag"v1"の同じリソースを読み取った。クライアントAが先に書き込み、リソースのETagは"v2"になった。クライアントBがIf-Match: "v1"で書き込みを送るとどうなる?