Кратко

  • RFC 9651 позволяет получить из принятого значения объявленную HTTP-структуру, но не назначает этому значению смысл и не разрешает действие.
  • Для надёжного решения нужны отдельные доказательства семантики поля, защищённого контекста, локальной авторизации и совершённого перехода состояния.

В автоматизированном пути легко принять успех разбора за успех решения. Библиотека возвращает аккуратный Dictionary, List или Item; метрика сообщает об успехе; следующая стадия обращается с результатом как с подтверждённой инструкцией. Но парсер ответил лишь на узкий вопрос: соответствуют ли полученные байты заданной грамматике. Он не устанавливал автора, право автора, область применимости, разрешение для субъекта запроса и факт завершения операции.

Именно этот узкий слой стандартизирует RFC 9651. Документ определяет повторно используемую абстрактную модель и строгие правила представления и разбора HTTP-полей, которые явно выбирают Structured Fields. Автор нового поля может объявить верхний тип Item, List или Dictionary вместо изобретения ещё одного похожего синтаксиса для ключей, параметров и значений. Благодаря этому разные реализации могут получить из одинаковых байтов одну и ту же структуру.

Совпадение структуры не создаёт совпадения смысла. RFC 9651 требует от автора поля определить семантику значения, дополнительные ограничения и последствия их нарушения. Универсальный парсер не знает, является ли ключ предпочтением, диагностикой, утверждением о кэше, меткой возможности или расширением, которое следует проигнорировать. Грамматика общая; последствия принадлежат определению конкретного поля.

Поэтому из успешного разбора нельзя вывести идентичность отправителя. Нельзя вывести, что посредник не добавил, не удалил и не заменил значение. Нельзя вывести право отправителя делать утверждение, допустимость членов поля для данного ресурса, разрешение аутентифицированного principal или результат commit. Это самостоятельные поверхности контроля, а не разные названия одной проверки.

Строгая обработка RFC 9651 остаётся важной. Некорректный ввод должен сорвать весь разбор, а не быть по-разному «исправлен» каждым получателем. Так уменьшается вероятность того, что терпимость одной реализации станет несовместимостью другой. Однако ошибка разбора не говорит сама по себе ни о намерении, ни об истинности, ни о владельце значения. Если одно поле дополняют несколько компонентов, неверная часть одного из них может сделать неразбираемым всё поле. Причину и значение этого события нужно устанавливать отдельно.

Следующая граница — конкретное определение поля. В реестре имён HTTP-полей IANA колонка Structured Type может сообщать только форму: Dictionary, List или Item. Это не реестр смысла и не реестр прав. Получатель обязан обратиться к спецификации данного имени: проверить допустимых членов, область действия, границы и требуемую реакцию на нарушение. Формально корректный Dictionary вполне может не иметь никакого эффекта в этом endpoint.

Отдельно защищается контекст. RFC 9651 предупреждает: сторона, способная внедрять новые HTTP-поля, может изменить значение Structured Field, и нельзя рассчитывать, что разбор всегда обнаружит это ошибкой. Если значение должно быть устойчиво к подмене, защиту нужно выбрать и проверить явно. TLS защищает транспортную связь; подписи могут покрывать выбранные компоненты. RFC 9421 требует определить охват и требования проверки. Из того, что парсер вернул объект, не следует ни наличие подписи, ни перечень покрытых компонентов.

Последнее решение остаётся за локальным endpoint. Здесь принятая семантика связывается с аутентифицированным principal, целью, действующей политикой и текущим состоянием. Наличие поля не делает его командой. Понятная команда не обязательно применима. Применимое значение не обязательно разрешено. А разрешённое действие может не дойти до commit из-за конфликта или предварительного условия. Запись «заголовок валиден» стирает различия, необходимые для объяснения фактического результата.

Переход от RFC 8941 к RFC 9651 показывает это на практике. Новый парсер может принять форму, которую старый считал недопустимой. Но он не может этим изменить договор старого поля. Логика конкретного поля по-прежнему решает, допустимы ли Date, параметр или расширение. Расширение множества читаемых выражений не расширяет полномочие отправителя.

Различение Лу Хэном символического и исполнимого слоя здесь полезно как дисциплина анализа. Читаемая структура — это представление. Последствие возникает лишь там, где локальный компонент применяет явное правило и отвечает за принятое решение.

Источники