From: William A. Rowe Jr Date: Mon, 18 Jul 2016 13:41:26 +0000 (+0000) Subject: Simplify; this code is executed one per request processed, saving X-Git-Tag: 2.5.0-alpha~1399 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=448c82bfd527396d91d81aa45d764dac78d1dba1;p=apache Simplify; this code is executed one per request processed, saving an immeasurably small quantum of CPU of a server under load. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1753223 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index e1f8e24b7f..dd9da7d6e1 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -754,193 +754,6 @@ AP_DECLARE(int) ap_method_register(apr_pool_t *p, const char *methname) return cur_method_number++; } -#define UNKNOWN_METHOD (-1) - -static int lookup_builtin_method(const char *method, apr_size_t len) -{ - /* Note: the following code was generated by the "shilka" tool from - the "cocom" parsing/compilation toolkit. It is an optimized lookup - based on analysis of the input keywords. Postprocessing was done - on the shilka output, but the basic structure and analysis is - from there. Should new HTTP methods be added, then manual insertion - into this code is fine, or simply re-running the shilka tool on - the appropriate input. */ - - /* Note: it is also quite reasonable to just use our method_registry, - but I'm assuming (probably incorrectly) we want more speed here - (based on the optimizations the previous code was doing). */ - - switch (len) - { - case 3: - switch (method[0]) - { - case 'P': - return (method[1] == 'U' - && method[2] == 'T' - ? M_PUT : UNKNOWN_METHOD); - case 'G': - return (method[1] == 'E' - && method[2] == 'T' - ? M_GET : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 4: - switch (method[0]) - { - case 'H': - return (method[1] == 'E' - && method[2] == 'A' - && method[3] == 'D' - ? M_GET : UNKNOWN_METHOD); - case 'P': - return (method[1] == 'O' - && method[2] == 'S' - && method[3] == 'T' - ? M_POST : UNKNOWN_METHOD); - case 'M': - return (method[1] == 'O' - && method[2] == 'V' - && method[3] == 'E' - ? M_MOVE : UNKNOWN_METHOD); - case 'L': - return (method[1] == 'O' - && method[2] == 'C' - && method[3] == 'K' - ? M_LOCK : UNKNOWN_METHOD); - case 'C': - return (method[1] == 'O' - && method[2] == 'P' - && method[3] == 'Y' - ? M_COPY : UNKNOWN_METHOD); - case 'B': - return (method[1] == 'R' - && method[2] == 'E' - && method[3] == 'W' - ? M_BREW : UNKNOWN_METHOD); - case 'W': - return (method[1] == 'H' - && method[2] == 'E' - && method[3] == 'N' - ? M_WHEN : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 5: - switch (method[2]) - { - case 'T': - return (memcmp(method, "PATCH", 5) == 0 - ? M_PATCH : UNKNOWN_METHOD); - case 'R': - return (memcmp(method, "MERGE", 5) == 0 - ? M_MERGE : UNKNOWN_METHOD); - case 'C': - return (memcmp(method, "MKCOL", 5) == 0 - ? M_MKCOL : UNKNOWN_METHOD); - case 'B': - return (memcmp(method, "LABEL", 5) == 0 - ? M_LABEL : UNKNOWN_METHOD); - case 'A': - return (memcmp(method, "TRACE", 5) == 0 - ? M_TRACE : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 6: - switch (method[0]) - { - case 'U': - switch (method[5]) - { - case 'K': - return (memcmp(method, "UNLOCK", 6) == 0 - ? M_UNLOCK : UNKNOWN_METHOD); - case 'E': - return (memcmp(method, "UPDATE", 6) == 0 - ? M_UPDATE : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - case 'R': - return (memcmp(method, "REPORT", 6) == 0 - ? M_REPORT : UNKNOWN_METHOD); - case 'D': - return (memcmp(method, "DELETE", 6) == 0 - ? M_DELETE : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 7: - switch (method[1]) - { - case 'P': - return (memcmp(method, "OPTIONS", 7) == 0 - ? M_OPTIONS : UNKNOWN_METHOD); - case 'O': - return (memcmp(method, "CONNECT", 7) == 0 - ? M_CONNECT : UNKNOWN_METHOD); - case 'H': - return (memcmp(method, "CHECKIN", 7) == 0 - ? M_CHECKIN : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 8: - switch (method[0]) - { - case 'P': - return (memcmp(method, "PROPFIND", 8) == 0 - ? M_PROPFIND : UNKNOWN_METHOD); - case 'C': - return (memcmp(method, "CHECKOUT", 8) == 0 - ? M_CHECKOUT : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 9: - return (memcmp(method, "PROPPATCH", 9) == 0 - ? M_PROPPATCH : UNKNOWN_METHOD); - - case 10: - switch (method[0]) - { - case 'U': - return (memcmp(method, "UNCHECKOUT", 10) == 0 - ? M_UNCHECKOUT : UNKNOWN_METHOD); - case 'M': - return (memcmp(method, "MKACTIVITY", 10) == 0 - ? M_MKACTIVITY : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 11: - return (memcmp(method, "MKWORKSPACE", 11) == 0 - ? M_MKWORKSPACE : UNKNOWN_METHOD); - - case 15: - return (memcmp(method, "VERSION-CONTROL", 15) == 0 - ? M_VERSION_CONTROL : UNKNOWN_METHOD); - - case 16: - return (memcmp(method, "BASELINE-CONTROL", 16) == 0 - ? M_BASELINE_CONTROL : UNKNOWN_METHOD); - - default: - return UNKNOWN_METHOD; - } - - /* NOTREACHED */ -} - /* Get the method number associated with the given string, assumed to * contain an HTTP method. Returns M_INVALID if not recognized. * @@ -951,18 +764,12 @@ static int lookup_builtin_method(const char *method, apr_size_t len) AP_DECLARE(int) ap_method_number_of(const char *method) { int len = strlen(method); - int which = lookup_builtin_method(method, len); - - if (which != UNKNOWN_METHOD) - return which; /* check if the method has been dynamically registered */ - if (methods_registry != NULL) { - int *methnum = apr_hash_get(methods_registry, method, len); + int *methnum = apr_hash_get(methods_registry, method, len); - if (methnum != NULL) { - return *methnum; - } + if (methnum != NULL) { + return *methnum; } return M_INVALID;