From: André Malo Date: Wed, 16 Jul 2003 01:04:23 +0000 (+0000) Subject: optimization: speed up ruleflag parsing. X-Git-Tag: pre_ajp_proxy~1411 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a685a36ed7361c1821a4c9da322583c14e250e1;p=apache optimization: speed up ruleflag parsing. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@100645 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index d02e9e0c9c..9b69df6c9f 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -858,110 +858,138 @@ static const char *cmd_rewriterule_setflag(apr_pool_t *p, char *key, char *val) { int status = 0; - int i; - - if ( strcasecmp(key, "redirect") == 0 - || strcasecmp(key, "R") == 0 ) { - cfg->flags |= RULEFLAG_FORCEREDIRECT; - if (strlen(val) > 0) { - if (strcasecmp(val, "permanent") == 0) { - status = HTTP_MOVED_PERMANENTLY; + int i = 0; + + switch (*key++) { + case 'c': + case 'C': + if (!*key || !strcasecmp(key, "hain")) { /* chain */ + cfg->flags |= RULEFLAG_CHAIN; + } + else if (((*key == 'O' || *key == 'o') && !key[1]) + || !strcasecmp(key, "ookie")) { /* cookie */ + while (cfg->cookie[i] && i < MAX_COOKIE_FLAGS) { + ++i; } - else if (strcasecmp(val, "temp") == 0) { - status = HTTP_MOVED_TEMPORARILY; + if (i < MAX_COOKIE_FLAGS) { + cfg->cookie[i] = apr_pstrdup(p, val); + cfg->cookie[i+1] = NULL; + } + else { + return "RewriteRule: too many cookie flags 'CO'"; } - else if (strcasecmp(val, "seeother") == 0) { - status = HTTP_SEE_OTHER; + } + break; + case 'e': + case 'E': + if (!*key || !strcasecmp(key, "nv")) { /* env */ + while (cfg->env[i] && i < MAX_ENV_FLAGS) { + ++i; } - else if (apr_isdigit(*val)) { - status = atoi(val); + if (i < MAX_ENV_FLAGS) { + cfg->env[i] = apr_pstrdup(p, val); + cfg->env[i+1] = NULL; } - if (!ap_is_HTTP_REDIRECT(status)) { - return "RewriteRule: invalid HTTP response code " - "for flag 'R'"; + else { + return "RewriteRule: too many environment flags 'E'"; } - cfg->forced_responsecode = status; } - } - else if ( strcasecmp(key, "noescape") == 0 - || strcasecmp(key, "NE") == 0 ) { - cfg->flags |= RULEFLAG_NOESCAPE; - } - else if ( strcasecmp(key, "last") == 0 - || strcasecmp(key, "L") == 0 ) { - cfg->flags |= RULEFLAG_LASTRULE; - } - else if ( strcasecmp(key, "next") == 0 - || strcasecmp(key, "N") == 0 ) { - cfg->flags |= RULEFLAG_NEWROUND; - } - else if ( strcasecmp(key, "chain") == 0 - || strcasecmp(key, "C") == 0 ) { - cfg->flags |= RULEFLAG_CHAIN; - } - else if ( strcasecmp(key, "type") == 0 - || strcasecmp(key, "T") == 0 ) { - cfg->forced_mimetype = apr_pstrdup(p, val); - ap_str_tolower(cfg->forced_mimetype); - } - else if ( strcasecmp(key, "env") == 0 - || strcasecmp(key, "E") == 0 ) { - for (i = 0; (cfg->env[i] != NULL) && (i < MAX_ENV_FLAGS); i++) - ; - if (i < MAX_ENV_FLAGS) { - cfg->env[i] = apr_pstrdup(p, val); - cfg->env[i+1] = NULL; + break; + case 'f': + case 'F': + if (!*key || !strcasecmp(key, "orbidden")) { /* forbidden */ + cfg->flags |= RULEFLAG_FORBIDDEN; } - else { - return "RewriteRule: too many environment flags 'E'"; + break; + case 'g': + case 'G': + if (!*key || !strcasecmp(key, "one")) { /* gone */ + cfg->flags |= RULEFLAG_GONE; } - } - else if ( strcasecmp(key, "cookie") == 0 || strcasecmp(key, "CO") == 0) { - for (i = 0; (cfg->cookie[i] != NULL) && (i < MAX_COOKIE_FLAGS); i++) - ; - if (i < MAX_COOKIE_FLAGS) { - cfg->cookie[i] = apr_pstrdup(p, val); - cfg->cookie[i+1] = NULL; + break; + case 'l': + case 'L': + if (!*key || !strcasecmp(key, "ast")) { /* last */ + cfg->flags |= RULEFLAG_LASTRULE; } - else { - return "RewriteRule: too many cookie flags 'CO'"; + break; + case 'n': + case 'N': + if (((*key == 'E' || *key == 'e') && !key[1]) + || !strcasecmp(key, "oescape")) { /* noescape */ + cfg->flags |= RULEFLAG_NOESCAPE; } - } - else if ( strcasecmp(key, "nosubreq") == 0 - || strcasecmp(key, "NS") == 0 ) { - cfg->flags |= RULEFLAG_IGNOREONSUBREQ; - } - else if ( strcasecmp(key, "proxy") == 0 - || strcasecmp(key, "P") == 0 ) { - cfg->flags |= RULEFLAG_PROXY; - } - else if ( strcasecmp(key, "passthrough") == 0 - || strcasecmp(key, "PT") == 0 ) { - cfg->flags |= RULEFLAG_PASSTHROUGH; - } - else if ( strcasecmp(key, "skip") == 0 - || strcasecmp(key, "S") == 0 ) { - cfg->skip = atoi(val); - } - else if ( strcasecmp(key, "forbidden") == 0 - || strcasecmp(key, "F") == 0 ) { - cfg->flags |= RULEFLAG_FORBIDDEN; - } - else if ( strcasecmp(key, "gone") == 0 - || strcasecmp(key, "G") == 0 ) { - cfg->flags |= RULEFLAG_GONE; - } - else if ( strcasecmp(key, "qsappend") == 0 - || strcasecmp(key, "QSA") == 0 ) { - cfg->flags |= RULEFLAG_QSAPPEND; - } - else if ( strcasecmp(key, "nocase") == 0 - || strcasecmp(key, "NC") == 0 ) { - cfg->flags |= RULEFLAG_NOCASE; - } - else { + else if (!*key || !strcasecmp(key, "ext")) { /* next */ + cfg->flags |= RULEFLAG_NEWROUND; + } + else if (((*key == 'S' || *key == 's') && !key[1]) + || !strcasecmp(key, "osubreq")) { /* nosubreq */ + cfg->flags |= RULEFLAG_IGNOREONSUBREQ; + } + else if (((*key == 'C' || *key == 'c') && !key[1]) + || !strcasecmp(key, "ocase")) { /* nocase */ + cfg->flags |= RULEFLAG_NOCASE; + } + break; + case 'p': + case 'P': + if (!*key || !strcasecmp(key, "roxy")) { /* proxy */ + cfg->flags |= RULEFLAG_PROXY; + } + else if (((*key == 'T' || *key == 't') && !key[1]) + || !strcasecmp(key, "assthrough")) { /* passthrough */ + cfg->flags |= RULEFLAG_PASSTHROUGH; + } + break; + case 'q': + case 'Q': + if ( !strcasecmp(key, "QSA") + || !strcasecmp(key, "qsappend")) { /* qsappend */ + cfg->flags |= RULEFLAG_QSAPPEND; + } + break; + case 'r': + case 'R': + if (!*key || !strcasecmp(key, "edirect")) { /* redirect */ + cfg->flags |= RULEFLAG_FORCEREDIRECT; + if (strlen(val) > 0) { + if (strcasecmp(val, "permanent") == 0) { + status = HTTP_MOVED_PERMANENTLY; + } + else if (strcasecmp(val, "temp") == 0) { + status = HTTP_MOVED_TEMPORARILY; + } + else if (strcasecmp(val, "seeother") == 0) { + status = HTTP_SEE_OTHER; + } + else if (apr_isdigit(*val)) { + status = atoi(val); + if (!ap_is_HTTP_REDIRECT(status)) { + return "RewriteRule: invalid HTTP response code " + "for flag 'R'"; + } + } + cfg->forced_responsecode = status; + } + } + break; + case 't': + case 'T': + if (!*key || !strcasecmp(key, "ype")) { /* type */ + cfg->forced_mimetype = apr_pstrdup(p, val); + ap_str_tolower(cfg->forced_mimetype); + } + break; + case 's': + case 'S': + if (!*key || !strcasecmp(key, "kip")) { /* skip */ + cfg->skip = atoi(val); + } + break; + default: return apr_pstrcat(p, "RewriteRule: unknown flag '", key, "'", NULL); } + return NULL; }