Анализ значений заголовков HTTP: цитирование, RFC 5987, MIME и т. Д. - PullRequest
6 голосов
/ 23 декабря 2011

Меня смущает декодирование заголовка HTTP значения .

Пример заголовка:
Some-Header: "quoted string?"; *utf-8'en'Weirdness

Можно ли заключить в кавычки значение ?Как насчет кодирования самого "?' является допустимым символом кавычки?Какое значение имеет точка с запятой (;)?Может ли анализатор значений для заголовка HTTP считаться анализатором MIME?

Я делаю прозрачный прокси, который должен прозрачно обрабатывать и изменять многие поля заголовка in-the-wild.Вот почему мне нужно так много деталей о формате.

1 Ответ

8 голосов
/ 23 декабря 2011

Можно ли указывать значения заголовка в кавычках?

Если вы имеете в виду, применяется ли производство RFC 5987 parameter к основной части значения заголовка, то нет.

Some-Header: "foo"; bar*=utf-8'en'bof

Здесь основная часть значения заголовка, вероятно, будет "foo", включая кавычки, но ...

Что означает точка с запятой (;)?

Специальная обработка определяется для каждого именованного заголовка отдельно. Таким образом, точка с запятой имеет значение, скажем, для Content-Disposition, но не для Content-Length.

Очевидно, что это не очень удовлетворительное решение, но это то, с чем мы застряли.

Я делаю прозрачный прокси, который должен прозрачно обрабатывать и изменять многие поля заголовка in-the-wild.

Вы не можете обрабатывать их в общем виде, вы должны знать форму каждого возможного заголовка. Для всего, что вы не узнаете, не пытайтесь разложить значение заголовка; и действительно, на данный момент так мало кто поддерживает RFC 5987, вряд ли вы сможете сделать много полезного для его обработки.

На сегодняшний день статус-кво состоит в том, что не-ASCII-символы в значениях заголовка не работают достаточно кросс-браузерно, чтобы их можно было использовать как в кодированном, так и в необработанном виде.

К счастью, они редко нужны. Единственный действительно распространенный вариант использования - это имена файлов, отличные от ASCII, для Content-Disposition, но это легче обойти, поместив имя файла в конечную часть пути URL.

Может ли анализатор значений для заголовка HTTP считаться анализатором MIME?

Нет. HTTP в значительной степени заимствует из MIME и семейства стандартов RFC 822 в целом, но он не входит в семейство 822. Он имеет собственную низкоуровневую грамматику для заголовков, которая выглядит как 822, но не совсем совместима. Произвольные функции MIME нельзя использовать в HTTP, должен существовать механизм стандартизации для явного перетаскивания их в HTTP - то, чем является RFC 5987 для (частей) RFC 2231.

(См. Раздел 19.4 RFC 2616 для обсуждения некоторых других отличий.)

Теоретически, multipart отправка формы является частью семейства 822, и вы должны иметь возможность использовать там кодировку RFC 2231. Но реальность такова, что браузеры тоже не поддерживают это.

...