Имеет ли значение порядок заголовков в ответе HTTP?
Имеет ли смысл когда-либо порядок заголовков
A: 1
B: 2
против
B:2
A:1
Я пытаюсь выяснить, могу ли я использовать словарь для хранения списка заголовков или это должен быть какой-то список или упорядоченный словарь.
5 ответов
Нет, это не имеет значения для заголовков с разными именами. См. RFC 2616, раздел 4.2:
Порядок получения полей заголовков с разными именами не имеет значения. Тем не менее, это "хорошая практика" - сначала отправлять поля общего заголовка, затем поля заголовка запроса или заголовка ответа и заканчивать полями заголовка объекта.
Это имеет значение, однако, для нескольких заголовков с одинаковым именем:
Несколько полей заголовка сообщения с одним и тем же именем поля МОГУТ присутствовать в сообщении тогда и только тогда, когда все значение поля для этого поля заголовка определено как список, разделенный запятыми [т.е. #(значения)]. ДОЛЖНО быть возможно объединить несколько полей заголовка в одну пару "имя-поля: поле-значение", не изменяя семантику сообщения, добавляя каждое последующее значение поля к первому, каждое из которых разделяется запятой. Порядок, в котором принимаются поля заголовка с одинаковым именем поля, поэтому важен для интерпретации объединенного значения поля, и, следовательно, прокси-сервер НЕ ДОЛЖЕН изменять порядок этих значений поля при пересылке сообщения.
Порядок заголовков не должен иметь значения. Могут быть "более слабые" реализации стандарта HTTP, где порядок имеет значение, но в целом это не должно быть.
Вот ссылка, которая описывает заголовки HTTP:
Заголовки HTTP не зависят друг от друга, и вы можете использовать словарь для их хранения, не беспокоясь об их порядке.
Это также может иметь значение при указании set-cookie
несколько раз за одно и то же печенье:
"Set-Cookie: COOKIE1=VALUE1; ...
"Set-Cookie: COOKIE1=VALUE2; ...
В этом случае, COOKIE1
будет установлен в VALUE2
и, если порядок изменился:
"Set-Cookie: COOKIE1=VALUE2; ...
"Set-Cookie: COOKIE1=VALUE1; ...
COOKIE1
будет установлен в VALUE1
RFC 7230, раздел 3.2.2: Field Order специально решает этот вопрос. Здесь приведены цитаты из этого раздела спецификации с акцентом, добавленным мной:
Порядок получения полей заголовков с разными именами не имеет значения.
Далее мы уточняем это с пометкой о хорошей практике ради производительности:
Однако рекомендуется сначала отправлять поля заголовка, которые содержат управляющие данные, такие как "Хост по запросам" и "Дата по ответам", чтобы реализации могли решить, когда обрабатывать сообщение как можно раньше.
В некоторых случаях допустимо, чтобы сообщение содержало несколько полей заголовка с одним и тем же именем. В этом случае порядок имеет значение.
Получатель МОЖЕТ объединить несколько полей заголовка с одним и тем же именем поля в одну пару "field-name: field-value", не изменяя семантику сообщения, добавляя каждое последующее значение поля в объединенное значение поля по порядку, разделяя их запятая. Порядок, в котором принимаются поля заголовка с одинаковым именем поля, имеет значение для интерпретации значения объединенного поля.