423 Locked
使い方
423 Locked エラーは、HTTP 上のファイルシステムとして使われる WebDAV の一部です。クライアントはファイルを LOCK または UNLOCK することができ、クライアントがロックされたリソースを変更しようとすると、サーバーはこのエラーを返します。
サーバーが最初にロックを許可する際、Lock-Token レスポンスヘッダーがクライアントへ送られます。これは後でリソースのロックを解除したり、ロックを更新したりするのに使えます。
レスポンスの一部として、サーバーはクライアントを導くための適切な前提条件または事後条件のコードを含めます。これには lock-token-submitted や no-conflicting-lock などが含まれます。
WebDAV 以外では、アカウントレベルのロックアウトを示すために 423 を再利用するプラットフォームもあります。Shopify の API は、API のレート制限違反の繰り返しやアカウントの未払い残高によりショップがロックされている場合に 423 Locked を返します。API アクセスが回復される前に、ショップのオーナーが Shopify パートナーダッシュボードを通じて問題を解決する必要があります。この用法はファイルロックとは無関係です。
SEO への影響
Google のような検索エンジンは、423 Locked のレスポンスステータスを持つ URL をインデックスしません。このステータスコードを返す、以前にインデックスされていた URL は検索結果から削除されます。
例
クライアントが対象のフォルダーへファイルをアップロードしようとします。そのフォルダーはロックされているため操作は許可されず、423 Locked エラーが返されます。続くリクエストで、クライアントは If リクエストヘッダーの一部として Lock-Token を含めることでリソースのロック解除を求めます。
その時点でフォルダーにあったロックが1つだけだったため、リクエストは成功します。UNLOCK の成功は、指定された Lock-Token が指すロックが解除されたことのみを意味します。他のロックは引き続き有効であり、再び 423 Locked を返します。
最初のリクエスト
PUT /documents/ HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
<PDF file transferred>
最初のレスポンス
HTTP/1.1 423 Locked
Content-Type: application/xml
Content-Length: 163
<?xml version="1.0" encoding="utf-8" ?>
<d:error xmlns:d="DAV:">
<d:lock-token-submitted>
<d:href>/documents/</d:href>
</d:lock-token-submitted>
</d:error>
ロック解除の要求を含む2回目のリクエスト
PUT /documents/ HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
If: (<urn:uuid:123…789>)
<PDF file transferred>
最終レスポンス
HTTP/1.1 204 No Content
対処方法
レスポンスボディで前提条件コードを確認します。lock-token-submitted のエラーは、リクエストに必要なロックトークンが欠けていたことを意味します。no-conflicting-lock のエラーは、別のロックがアクセスを妨げていることを意味します。
そのロックが同じクライアントセッションのものであれば、Lock-Token の値を If リクエストヘッダーに含めてリクエストを再送信します。サーバーはトークンを検証し、変更を許可します。
別のユーザーやプロセスがロックを保持している場合は、ロックの期限切れを待つか、ロックの所有者に連絡します。ロックのタイムアウトは WebDAV サーバーで設定可能です。ロックがどれだけ持続するかを判断するため、ロックが最初に許可されたときに返された Timeout ヘッダーの値を確認します。
SharePoint や Office Online の環境では、デスクトップアプリケーションによってロックされたファイルは、そのアプリケーションが閉じられるか設定されたタイムアウトが経過するまでロックされたままです。管理者は SharePoint の管理インターフェイスを通じて、残存したロックを解放します。
ロックを明示的に解放するには、一致する Lock-Token を伴う UNLOCK リクエストを送信します。ロック解除が成功しても、解除されるのは指定したロックだけです。同じリソースに対する他のロックは有効なまま残り、引き続きこのエラーを発生させます。
サーバー側では、放置されたロックが他のクライアントを無期限にブロックしないよう、妥当なロックのタイムアウトを設定します。WebDAV 仕様は、サーバーが無期限のロックを許可するのではなくタイムアウトの上限を適用することを推奨しています。
Shopify API の利用者にとって、423 はショップ自体がロックされていることを意味します。パートナーダッシュボードを通じて未払い残高を解消するか、API アクセスを回復するために Shopify のサポートに問い合わせてください。
コードリファレンス
.NET
HttpStatusCode.Locked
Rust
http::StatusCode::LOCKED
Rails
:locked
Go
http.StatusLocked
Symfony
Response::HTTP_LOCKED
Python3.5+
http.HTTPStatus.LOCKED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_LOCKED
Angular
@angular/common/http/HttpStatusCode.Locked