Ошибка MIME RFC "Content-Type"? Нечеткая спецификация RFC

Я пытаюсь реализовать базовый синтаксический анализатор MIME для multipart/related в С++/Qt.

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

От RFC882 Раздел 3.1.1:

Каждое поле заголовка можно рассматривать как единую логическую строку ASCII-символы, содержащие имя поля и поле-тело. Для удобства полевая часть этого концептуального объект можно разделить на многострочное представление; это называется "складыванием". Общее правило гласит, что везде может быть линейно-белое пространство (не просто LWSP-символы), CRLF сразу же после чего следует, что один LWSP- char может быть вставлено. Таким образом, единственная строка

Хорошо, поэтому я просто разбираю поле заголовка, и если CRLF следует с линейным пробелом, я просто соглашаюсь с тем, чтобы использовать его в одной строке заголовка. Продолжить...

Из RFC2045 Раздел 5.1:

В расширенной нотации BNF RFC 822 поле заголовка Content-Type значение определяется следующим образом:

 content := "Content-Type" ":" type "/" subtype
            *(";" parameter)
            ; Matching of media type and subtype
            ; is ALWAYS case-insensitive.

[...]

 parameter := attribute "=" value

 attribute := token
              ; Matching of attributes
              ; is ALWAYS case-insensitive.

 value := token / quoted-string

 token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
             or tspecials>

Хорошо. Так что, если вы хотите указать заголовок Content-Type с параметрами, просто сделайте это так:

Content-Type: multipart/related; foo=bar; something=else

... и сложенная версия того же заголовка будет выглядеть так:

Content-Type: multipart/related;
    foo=bar;
    something=else

Правильно? Хорошо. Поскольку я продолжал читать RFC, я встретил следующее в RFC2387 Раздел 5.1 (Примеры):

 Content-Type: Multipart/Related; boundary=example-1
         start="<[email protected]>";
         type="Application/X-FixedRecord"
         start-info="-o ps"

 --example-1
 Content-Type: Application/X-FixedRecord
 Content-ID: <[email protected]>

 [data]
 --example-1
 Content-Type: Application/octet-stream
 Content-Description: The fixed length records
 Content-Transfer-Encoding: base64
 Content-ID: <[email protected]>

 [data]

 --example-1--

Хм, это странно. Вы видите заголовок Content-Type? У него есть ряд параметров, но не у всех есть ";" как разделитель параметров.

Возможно, я просто не читал RFC правильно, но если мой парсер работает строго так, как указано спецификацией, параметры type и start-info приведут к одной строке или, что еще хуже, ошибке парсера.

Ребята, что вы думаете об этом? Просто опечатка в RFC? Или я что-то пропустил?

Спасибо!

Ответы

Ответ 1

Это опечатка в примерах. Параметры всегда должны быть разделены точками с запятой правильно, даже когда они сложены. Сгибание не предназначено для изменения семантики заголовка, только для обеспечения удобочитаемости и учета систем с ограничениями длины строки.

Ответ 2

Вполне возможно, опечатка, но в целом (и из опыта) вы также сможете справиться с такими вещами "в дикой природе". В частности, почтовые клиенты сильно отличаются своей способностью генерировать достоверные сообщения и следовать всем соответствующим спецификациям (во всяком случае, это еще хуже в мире электронной почты /SMTP, чем в мире WWW!)