Собственно, весь обсуждаемый ngx_http_parse.c написан упоротым оптимизатором, которому даже strncmp использовать западло. Взамен это:#define ngx_str3_cmp(m, c0, c1, c2, c3) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
#define ngx_str3Ocmp(m, c0, c1, c2, c3) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
#define ngx_str4cmp(m, c0, c1, c2, c3) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
#define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
&& m[4] == c4
#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
&& (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)
#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
&& ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)
#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
&& ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)
#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
&& ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4) \
&& m[8] == c8
А в старых версиях, помнится, было и вовсе: if m[0] == 'P' && m[1] == 'O' && m[2] == 'S' && m[3] == 'T'. И весь парсер состоит из вложенных switch... case... switch... case... switch... case... на пятнадцать экранов, с адресной арифметикой и кучей глобальных переменных состояния. Вот вы можете головой поручиться, что там нет логических ошибок? Лично я б за вашу голову много не дал. Безопасный сетевой код так не пишут.
В lighttpd2 вон перестали заниматься хернёй и начали использовать glib для строк и ragel для парсеров, потому ковбойские времена K&R уже прошли, и кто не использует библиотечные функции и кодогенераторы, тот школота и мерзавец. Повторяю: ШКОЛОТА И МЕРЗАВЕЦ.