Я пытаюсь проанализировать поле заголовка HTTP в соответствии с правилом ABNF header-field
, указанным в в соответствующем разделе RFC 7230 .Вот эти правила:
header-field = field-name ":" OWS field-value OWS
field-name = token
field-value = *( field-content / obs-fold )
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
field-vchar = VCHAR / obs-text
obs-fold = CRLF 1*( SP / HTAB )
; obsolete line folding
; see Section 3.2.4
(obs-text
- это просто старшие байты от 0x80 до 0xff).
Проблема, с которой я сталкиваюсь, заключается в том, что правило header-field
, похоже, перестает работать, когдаприменил строку user-agent, которую устанавливает chrome в режиме реагирования:
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Mobile Safari/537.36
Проблема связана с одиночным «5»: когда анализатор достигает последних «s» в «Nexus», он принимает оба's', следующий пробел и '5'.Это оставляет курсор синтаксического анализа в пробел сразу после.То есть
Parsed: ______________]
Data: ...6.0; Nexus 5 Build/MRA58N...
Cursor: ^
Поскольку feild-content
не допускает начальные пробелы, правило не может сопоставляться со всем полем заголовка, что приводит к тому, что синтаксический анализатор не может проанализировать остальную часть сообщения.
Для меня очевидно, что заголовки HTTP должны содержать отдельные символы, окруженные пробелами.Однако это, по-моему, запрещено в соответствии с моим прочтением спецификации.
Я искал в Интернете, но не нашел ничего подходящего.Поэтому я предполагаю, что это ошибка с моей стороны.Где моя ошибка?и как на самом деле должно интерпретироваться правило?