Разборка каждой части поля заголовка HTTP
Вопрос
Я разбираю HTTP Data прямо из пакетов (либо TCP реконструирован, либо нет, вы можете предположить, что это).
Я ищу лучший способ анализировать HTTP как можно точнее.
Основная проблема здесь является заголовка HTTP.
Глядя на основные RFC http / 1.1, Кажется, что разборка заголовка HTTP будет сложным. RFC описывает очень сложные регулярные выражения для разных частей заголовка.
Должен ли я написать эти регулярные выражения для разбора разных частей заголовка HTTP?
Основные расставания, которые я написал до сих пор для заголовка HTTP предназначен для общего заголовка HTTP:
message-header = field-name ":" [ field-value ]
И я включил замена внутреннего LWS
с участием SP
и повторяющиеся заголовки с тем же field-name
С разделенными запятыми значениями, как описано в разделе 4.2.
Тем не менее, глядя на раздел 14.9, например, показывает, что для того, чтобы разбирать разные части field-value
Мне нужна гораздо более сложная схема разборки.
Как вы предлагаете, я должен обрабатывать сложные части HTTP Parsing (специально field-value
) Предполагая, что я хочу дать пользователям парсеров полные возможности http и разбирать каждую часть http?
Предложения дизайна для этого также будут оценены.
Спасибо.
Решение
Я бы следовал директору одной ответственности. Вместо того, чтобы пытаться создать один монолитный парсер, который знает каждую деталь каждого HTTP-заголовка, известного человеку, упростить. Напишите простой расширяемый анализатор, который в самом себе несет ответственность за то, что справляется с разбором имени поля и связать это имя с помощью необработанного значения. Затем воспользуйтесь подключаемыми расширениями, которые отвечают только за анализ одного вида заголовка. Когда вы создаете экземпляр вашего анализатора, введите сбор расширений, и набрать каждое расширение на набор имен полей, которые он знает, как разбираться.
Вы убиваете двух птиц одним камнем с таким подходом. Ваш основной парсер остается простым и целевым. Вы также получаете возможность расширить свой анализатор без необходимости беспорядок с его кишками, что приводит к более надежному коду.
Другие советы
Внутри парсеров есть куча парсеров System.Net.Http.Headers
пространство имен. Стоит посмотреть.