История изменений
Исправление dimgel, (текущая версия) :
Так, где оно у меня было… Вот примерно так (убрал длинные квалификаторы имён) я парсил заголовки запроса в своём embedded веб-сервере. А точнее в коде, сгенерированным этим сервером-фреймворком по списку заголовков запроса, которые нужны приложению:
switch (*s | 0x20) {
case 'c': {
s++;
if ((*(const uint16_t*)s | 0x2020) != 0x6e6f) { // "on"
return ERROR;
}
s += 2;
switch (*s | 0x20) {
case 'n': {
s++;
if ((*(const uint32_t*)s | 0x20202020) != 0x69746365 || (*(const uint16_t*)(s + 4) | 0x2020) != 0x6e6f || (s[6] | 0x20) != ':') { // "ection:"
return ERROR;
}
return CONNECTION;
}
case 't': {
s++;
if ((*(const uint32_t*)s | 0x20202020) != 0x2d746e65) { // "ent-"
return ERROR;
}
s += 4;
switch (*s | 0x20) {
case 'l': {
s++;
if ((*(const uint32_t*)s | 0x20202020) != 0x74676e65 || (*(const uint16_t*)(s + 4) | 0x2020) != 0x3a68) { // "ength:"
return ERROR;
}
return CONTENT_LENGTH;
}
...
Понятно, что это HTTP/1.1 (в HTTP/2 имена стандартных заголовков не текстовые), но пойнт в том, что парсер URL-ей генерировался точно такой же, по buildtime-маппингу URL-ей на хэндлеры.
Пусть кто-нибудь попробует переплюнуть. Ну разве что сейчас я бы ещё [[unlikely]]
раскидал перед return ERROR
.
Исходная версия dimgel, :
Так, где оно у меня было… Вот примерно так (убрал длинные квалификаторы имён) я парсил заголовки запроса в своём embedded веб-сервере. А точнее в коде, сгенерированным этим сервером-фреймворком по списку заголовков запроса, которые нужны приложению:
switch (*s | 0x20) {
case 'c': {
s++;
if ((*(const uint16_t*)s | 0x2020) != 0x6e6f) { // "on"
return ERROR;
}
s += 2;
switch (*s | 0x20) {
case 'n': {
s++;
if ((*(const uint32_t*)s | 0x20202020) != 0x69746365 || (*(const uint16_t*)(s + 4) | 0x2020) != 0x6e6f || (s[6] | 0x20) != ':') { // "ection:"
return ERROR;
}
return CONNECTION;
}
case 't': {
s++;
if ((*(const uint32_t*)s | 0x20202020) != 0x2d746e65) { // "ent-"
return ERROR;
}
s += 4;
switch (*s | 0x20) {
case 'l': {
s++;
if ((*(const uint32_t*)s | 0x20202020) != 0x74676e65 || (*(const uint16_t*)(s + 4) | 0x2020) != 0x3a68) { // "ength:"
return ERROR;
}
return CONTENT_LENGTH;
}
...
Понятно, что это HTTP/1.1 (в HTTP/2 имена стандартных заголовков не текстовые), но пойнт в том, что парсер URL-ей генерировался точно такой же, по buildtime-маппингу URL-ей на хэндлеры.
Пусть кто-нибудь попробует переплюнуть.