LINUX.ORG.RU

История изменений

Исправление 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-ей на хэндлеры.

Пусть кто-нибудь попробует переплюнуть.