423 Locked
Применение
Ошибка 423 Locked является частью WebDAV, который применяется как файловая система поверх HTTP. Клиенты могут выполнять над файлами операции LOCK или UNLOCK, и если клиент пытается изменить заблокированный ресурс, сервер возвращает именно эту ошибку.
Когда сервер впервые предоставляет блокировку, клиенту отправляется заголовок ответа Lock-Token, который позже можно использовать для разблокировки ресурса или продления блокировки.
В составе ответа сервер передаёт соответствующий код предусловия или постусловия, помогающий сориентировать клиента. Это может быть lock-token-submitted или no-conflicting-lock.
За пределами WebDAV некоторые платформы используют 423 для обозначения блокировки на уровне учётной записи. API Shopify возвращает 423 Locked, когда магазин заблокирован из-за неоднократных нарушений ограничений частоты обращений к API или непогашенной задолженности по счёту. Владелец магазина должен устранить проблему через партнёрскую панель Shopify, прежде чем доступ к API будет восстановлен. Это применение никак не связано с блокировкой файлов.
Влияние на SEO
Поисковые системы вроде Google не индексируют URL с кодом состояния ответа 423 Locked. Ранее проиндексированные URL, возвращающие этот код состояния, удаляются из результатов поиска.
Пример
Клиент пытается загрузить файл в целевую папку. Папка заблокирована, поэтому операция не разрешена и возвращается ошибка 423 Locked. В последующем запросе клиент запрашивает разблокировку ресурса, включив Lock-Token в состав заголовка запроса If.
Запрос выполняется успешно, потому что на тот момент на папке была только одна блокировка. Успешный 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>
Второй запрос, включающий запрос на разблокировку
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.
Отправьте запрос UNLOCK с соответствующим Lock-Token, чтобы явно снять блокировку. Успешная разблокировка снимает только указанную блокировку. Другие блокировки того же ресурса остаются активными и продолжают вызывать эту ошибку.
На стороне сервера задайте разумные тайм-ауты блокировок, чтобы заброшенные блокировки не блокировали других клиентов бесконечно. Спецификация WebDAV рекомендует серверам применять ограничения по времени, а не предоставлять бессрочные блокировки.
Для потребителей API Shopify 423 означает, что заблокирован сам магазин. Погасите задолженность через партнёрскую панель или обратитесь в поддержку Shopify, чтобы восстановить доступ к API.
Примеры кода
.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