summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Erenkrantz <jerenkrantz@apache.org>2001-09-19 07:52:42 +0200
committerJustin Erenkrantz <jerenkrantz@apache.org>2001-09-19 07:52:42 +0200
commitcb8569e4f8030abd8478444127b8f1959ce204ae (patch)
treeb4f6ddff3d0658638c73f438058658dd4bdc5cd6
parentTurn the worker MPM's queue into a LIFO. This may (diff)
downloadapache2-cb8569e4f8030abd8478444127b8f1959ce204ae.tar.xz
apache2-cb8569e4f8030abd8478444127b8f1959ce204ae.zip
This patch eliminates the wasteful run-time conversion of method names from
strings to numbers in places where the methods are known at compile time. (Justin fixed the va_end() call to be correct.) Submitted by: Brian Pane <bpane@pacbell.net> Reviewed by: Justin Erenkrantz git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91078 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES4
-rw-r--r--include/http_request.h19
-rw-r--r--modules/http/http_request.c24
-rw-r--r--modules/mappers/mod_negotiation.c2
-rw-r--r--server/core.c2
5 files changed, 49 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index f81f646ecd..bd85b53c9a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
Changes with Apache 2.0.26-dev
+ *) Eliminate the wasteful run-time conversion of method names from strings
+ to numbers in places where the methods are known at compile time.
+ [Brian Pane <bpane@pacbell.net>]
+
*) Turn the worker MPM's queue into a LIFO. This may
improve cache-hit performance under some conditions.
[Aaron Bannert <aaron@clove.org>]
diff --git a/include/http_request.h b/include/http_request.h
index f532cd0491..f1963eb20c 100644
--- a/include/http_request.h
+++ b/include/http_request.h
@@ -261,6 +261,25 @@ AP_DECLARE(void) ap_update_mtime(request_rec *r, apr_time_t dependency_mtime);
*/
AP_DECLARE(void) ap_allow_methods(request_rec *r, int reset, ...);
+/**
+ * Add one or more methods to the list permitted to access the resource.
+ * Usually executed by the content handler before the response header is
+ * sent, but sometimes invoked at an earlier phase if a module knows it
+ * can set the list authoritatively. Note that the methods are ADDED
+ * to any already permitted unless the reset flag is non-zero. The
+ * list is used to generate the Allow response header field when it
+ * is needed.
+ * @param r The pointer to the request identifying the resource.
+ * @param reset Boolean flag indicating whether this list should
+ * completely replace any current settings.
+ * @param ... A list of method identifiers, from the "M_" series
+ * defined in httpd.h, terminated with a value of -1
+ * (e.g., "M_GET, M_POST, M_OPTIONS, -1")
+ * @return None.
+ * @deffunc void ap_allow_standard_methods(request_rec *r, int reset, ...)
+ */
+AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...);
+
#define MERGE_ALLOW 0
#define REPLACE_ALLOW 1
diff --git a/modules/http/http_request.c b/modules/http/http_request.c
index 296fffb8d7..4dbbc788b2 100644
--- a/modules/http/http_request.c
+++ b/modules/http/http_request.c
@@ -490,3 +490,27 @@ AP_DECLARE(void) ap_allow_methods(request_rec *r, int reset, ...)
ap_method_list_add(r->allowed_methods, method);
}
}
+
+AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...)
+{
+ int method;
+ va_list methods;
+ apr_int64_t mask;
+
+ /*
+ * Get rid of any current settings if requested; not just the
+ * well-known methods but any extensions as well.
+ */
+ if (reset) {
+ ap_clear_method_list(r->allowed_methods);
+ }
+
+ mask = 0;
+ va_start(methods, reset);
+ while ((method = va_arg(methods, int)) != -1) {
+ mask |= (AP_METHOD_BIT << method);
+ }
+ va_end(methods);
+
+ r->allowed_methods->method_mask |= mask;
+}
diff --git a/modules/mappers/mod_negotiation.c b/modules/mappers/mod_negotiation.c
index 7e910c94cc..bde4dab442 100644
--- a/modules/mappers/mod_negotiation.c
+++ b/modules/mappers/mod_negotiation.c
@@ -2768,7 +2768,7 @@ static int handle_map_file(request_rec *r)
apr_bucket_brigade *bb;
apr_bucket *e;
- ap_allow_methods(r, REPLACE_ALLOW, "GET", "OPTIONS", "POST", NULL);
+ ap_allow_standard_methods(r, REPLACE_ALLOW, M_GET, M_OPTIONS, M_POST, -1);
if ((res = ap_discard_request_body(r)) != OK) {
return res;
}
diff --git a/server/core.c b/server/core.c
index 241ad239e5..f52b5e024a 100644
--- a/server/core.c
+++ b/server/core.c
@@ -2676,7 +2676,7 @@ static int default_handler(request_rec *r)
bld_content_md5 = (d->content_md5 & 1)
&& r->output_filters->frec->ftype != AP_FTYPE_CONTENT;
- ap_allow_methods(r, MERGE_ALLOW, "GET", "OPTIONS", "POST", NULL);
+ ap_allow_standard_methods(r, MERGE_ALLOW, M_GET, M_OPTIONS, M_POST, -1);
if ((errstatus = ap_discard_request_body(r)) != OK) {
return errstatus;