Internet Assigned Numbers Authority (IANA) действует как реестр для значений лексем кодирования содержимого (content-coding). Первоначально реестр содержал следующие лексемы:
gzip Формат кодирования, производящий сжатие файла программой "gzip" (GNU zip), описанный в RFC 1952. Это формат Lempel-Ziv кодирования (LZ77) с 32 разрядным CRC.
compress Формат кодирования, производимый общей программой "compress" для сжатия UNIX файлов. Это формат адаптивного Lempel-Ziv-Welch кодирования (LZW).
Конечно, использовать названия программ для идентификации форматов кодирования не желательно и может пересекаться с форматами, которые возникнут в последствии. Их использование объясняется исторической практикой. Для совместимости с предыдущими реализациями HTTP, приложения должны рассматривать "x-gzip" и "x-compress" как эквиваленты "gzip" и "compress" соответственно.
deflate Формат zlib, определенный в 1950, в комбинации с механизмом сжатия "deflate", описанным в RFC 1951.
Новая лексема значения кодирования содержимого (content-coding) должна быть зарегистрирована; чтобы обеспечить взаимодействие между клиентами и серверами, спецификация алгоритма кодирования содержимого, необходимого для определения нового значения, должна быть открыто опубликована и адекватна для независимой реализации, а также соответствовать цели кодирования содержимого определенного в этом разделе.
3.6 Кодирования передачи (Transfer Codings).
Значения кодирования передачи используются для указания преобразования кодирования, которое было или должно быть применено к телу объекта (entity-body) в целях гарантирования "безопасной передачи" по сети. Оно отличается от кодирования содержимого тем, что кодирование передачи - это свойство сообщения, а не первоначального объекта.
transfer-coding = "chunked" | transfer-extension
transfer-extension = token
Все значения кодирования передачи (transfer-coding) не чувствительны к регистру. HTTP/1.1 использует значения кодирования передачи (transfer-coding) в поле заголовка Transfer-Encoding.
Кодирования передачи - это аналоги значений Content-Transfer-Encoding MIME, которые были разработаны для обеспечения безопасной передачи двоичных данных при использовании 7-битного обслуживания передачи. Однако безопасный транспорт имеет другое предназначение для чисто 8-битного протокола передачи. В HTTP единственная опасная характеристика тела сообщения вызвана сложностью определения точной длины тела сообщения, или желанием шифровать данные при пользовании общедоступным транспортом.
Кодирование по кускам (chunked encoding) изменяет тело сообщения для передачи его последовательностью кусков, каждый из которых имеет собственный индикатор размера, сопровождаемым опциональным завершителем, содержащим поля заголовка объекта. Это позволяет динамически создаваемому содержимому передаваться вместе с информацией, необходимой получателю для проверки полноты получения сообщения.
Chunked-Body = *chunk "0" CRLF footer CRLF
chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF
hex-no-zero = <HEX за исключением "0">
chunk-size = hex-no-zero *HEX chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ]) chunk-ext-name = token chunk-ext-val = token | quoted-string chunk-data = chunk-size(OCTET)
footer = *entity-header
Кодирование по кускам (chunked encoding) оканчивается куском нулевого размера, следующим за завершителем, оканчивающимся пустой строкой. Цель завершителя состоит в эффективном методе обеспечения информации об объекте, который сгенерирован динамически; приложения не должны посылать в завершителе поля заголовка, которые явно не предназначены для использования в завершителе, такие как Content-MD5 или будущие расширения HTTP для цифровых подписей и других возможностей.
Все HTTP/1.1 приложения должны быть в состоянии получать и декодировать кодирование передачи "по кускам" ("chunked" transfer coding), и должны игнорировать расширения кодирования передачи, которые они не понимают. Серверу, который получил тело объекта со значением кодирования передачи, которое он не понимает, следует возвратить ответ с кодом 501 (Не реализовано, Not Implemented) и разорвать соединение. Сервер не должен посылать поля кодирования передачи (transfer-coding) HTTP/1.0 клиентам.
3.7 Медиатипы (Media Types).
HTTP использует МедиаТипы Интернета (Internet Media Types) в полях заголовка Content-Type и Accept для обеспечения открытой и расширяемой типизации данных и типов.
media-type = type "/" subtype *( ";" parameter ) type = token subtype = token
Параметры могут следовать за type/subtype в форме пар атрибут/значение (attribute/value).
parameter = attribute "=" value attribute = token value = token | quoted-string
Тип, подтип, и имена атрибутов и параметров не чувствительны к регистру. Значения параметров могут быть чувствительными к регистру, но могут быть и не чувствительны, в зависимости от семантики имени параметра. Линейный пробел (LWS) не должен использоваться между типом и подтипом, между атрибутом и значением. Агенты пользователей, распознающие медиатипы, должны обрабатывать (или подготавливать для обработки любыми внешними приложениями) параметры для тех типов MIME, которые описаны, и сообщать пользователю об обнаруженных проблемах.
Некоторые старые HTTP приложения не распознают параметры медиатипов. При посылке данных к таким HTTP приложениям реализации должны использовать параметры медиатипов только тогда, когда это требуется по определению типа/подтипа.
Значения медиатипов регистрируются Internet Assigned Number Authority (IANA). Процесс регистрации медиатипа определен в RFC 2048. Использование не зарегистрированных медиатипов запрещено.
3.7.1 Канонизация и предопределенные значения типа text.
Медиатипы Интернет зарегистрированы в канонической форме. В общем случае тело объекта, передаваемое HTTP сообщением, должно быть представлено в соответствующей каноническиой форме до передачи; исключение составляют типы "text", определяемые в следующем абзаце.
В канонической форме медиаподтипы типа "text" используют CRLF в качестве метки конца строки. HTTP ослабляет это требование и позволяет передавать текст размеченный таким образом, что еденичные CR или LF могут быть метками конца строки, правда это правило должно быть выполнено для всего тела объекта (entity-body). HTTP приложения должны воспринимать CRLF, просто CR и просто LF как представление конца строки в текстовых типах, переданных по HTTP. Кроме того, если текст представляется в кодовой таблице, которая не использует октеты 13 и 10 для CR и LF соответственно, что имеет место в некоторых многобайтовых кодовых таблицах, то HTTP позволяет использовать любые последовательности октетов, определенные этим набором символов для представления эквивалентов CR и LF в качестве кода конца строки. Эта гибкость в отношении концов строк применима только к текстовым типам в теле объекта; просто CR или просто LF не должны заменять CRLF внутри любой управляющей структуры HTTP (например поля заголовка и разделителей типа multipart).
Если тело объекта кодируется при помощи Content-Encoding, то основные данные должны быть в определенной выше форме до кодирования.
Параметр "charset" используется с некоторыми медиатипами для указания кодовой таблицы, используемой для представления данных. Если параметр "charset" не указан отправителем, то при получении по HTTP медиаподтипы типа "text" имеют значение "charset", по умолчанию равное "ISO-8859-1". Данные в кодовых таблицах или их подмножествах, отличных от "ISO-8859-1", должны быть помечены соответствующим значением "charset".
Некоторое программное обеспечение HTTP/1.0 неправильно интерпретировало заголовок Content-Type без параметра "charset", как означающее "должен предположить получатель". Отправители, желающие предусмотреть такое поведение могут включать параметр "charset" даже когда charset равен ISO-8859-1 и должны сделать это, если известно, что это не запутает получателя.
К сожалению, некоторые старые HTTP/1.0 клиенты не работали правильно с определением параметра "charset". HTTP/1.1 получатели должны отдавать приоритет метке "charset", поставленной отправителем; и те агенты пользователей, которые имеют возможность "предположить" charset должны при первоначальном отображении документа использовать charset из поля content-type, если они поддерживают такой charset, а затем использовать собственные установки.
MIME предусматривает ряд типов "multipart" - формирующих пакет из одного или нескольких объектов внутри тела одного сообщения. Все типы mulptipart используют общий синтаксис, определеный в MIME, и должны содержать разделительный параметр частью значения медиатипа. Тело сообщения - самостоятельный элемент протокола и, следовательно, должно использовать только СRLF для представления концов строк между частями тела (body-parts). В отличие от MIME, заключение (epilogue) любого multipart сообщения должно быть пустым; HTTP приложения не должны передавать заключение (даже если первоначальный multipart содержит заключение).
В HTTP части тела (body-parts) типа multipart могут содержать поля заголовка, которые являются значащими в примнении к этой части. Поле заголовка Content-Location следует включать в часть тела (body-part) каждого включенного объекта, который может быть идентифицирован URL.
Вообще говоря, HTTP агенту пользователя належит действовать так же как поступил бы MIME агент пользователя после получения типа multipart. Если приложение получает незарегистрированный подтип multipart, оно должно обрабатывать его как подтип "multipart/mixed".
Тип "multipart/form-data" был специально определен для передачи данных формы, подходящих для обработки методом запроса POST, что описано в RFC 1867.
3.8 Маркеры продуктов (Product Tokens).
Маркеры продуктов используются, чтобы обеспечить коммуникационным приложениям возможность идентифицировать себя названием и версией программного обеспечения. Большинство полей, использующих маркеры продуктов также допускает перечисление подпрограмм, которые формируют значительную часть приложения, и которые перечисляются через пробел. В соответствии с соглашением, подпрограммы перечисляются в порядке их значения для идентификации приложения.