Pull to refresh

Comments 2

Классно.
Глядя на HTTP парсер nginx я задавался вопросом: неужели этот код написан человеком? Куча состояний, условий переходов.
Наверняка использовался какой-то инструмент для генерации конечных автоматов или весь ваш код написан руками?

Только увидел коментарий. Весь парсер у нас писался руками. Мы используем на макросах С некоторое подобие DSL, чтобы писать было проще. Есть HTTP парсеры, сгенерированные Ragel, но, во-первых, насколько помню, не вся грамматика HTTP может быть выражена таким генератором парсеров. Во-вторых, мы старались изолировать парсер от остального кода (аллокаторов памяти, сетевых структур и HTTP логики), но на практике это получается плохо.

Иными словами, если мы посмотрим не только на сервера, которые могут обрабатывать трафик из Internet типа Nginx, H2O, Varnish, HAproxy, но и "легкие" реализации, в основном предназначенные для микросервисных коммуникаций типа boost::beast, Pistache, libhttpserver или uWebSockets - у всех будут руками написанные парсеры.

Sign up to leave a comment.