summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Jagielski <jim@apache.org>2011-02-14 20:21:37 +0100
committerJim Jagielski <jim@apache.org>2011-02-14 20:21:37 +0100
commit917522448250d28cbb4b804ba00e45147d056c0b (patch)
treee954c5b642d6031af07fa7866d117ed25203408b
parentMention ap_state_query() in the new API docs (diff)
downloadapache2-917522448250d28cbb4b804ba00e45147d056c0b.tar.xz
apache2-917522448250d28cbb4b804ba00e45147d056c0b.zip
New hook: ap_run_pre_read_request()
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1070616 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--include/http_protocol.h25
-rw-r--r--modules/examples/mod_example_hooks.c18
-rw-r--r--server/protocol.c6
3 files changed, 43 insertions, 6 deletions
diff --git a/include/http_protocol.h b/include/http_protocol.h
index 5b71dfd0e6..bc00e7bed7 100644
--- a/include/http_protocol.h
+++ b/include/http_protocol.h
@@ -554,11 +554,24 @@ AP_DECLARE(int) ap_method_number_of(const char *method);
AP_DECLARE(const char *) ap_method_name_of(apr_pool_t *p, int methnum);
- /* Hooks */
- /*
- * post_read_request --- run right after read_request or internal_redirect,
- * and not run during any subrequests.
- */
+/* Hooks */
+/*
+ * pre_read_request --- run right before read_request_line(),
+ * and not run during any subrequests.
+ */
+/**
+ * This hook allows modules to affect the request or connection immediately before
+ * the request has been read, and before any other phases have been processes.
+ * @param r The current request of the soon-to-be-read request
+ * @param c The connection
+ * @return None/void
+ */
+AP_DECLARE_HOOK(void,pre_read_request,(request_rec *r, conn_rec *c))
+
+/*
+ * post_read_request --- run right after read_request or internal_redirect,
+ * and not run during any subrequests.
+ */
/**
* This hook allows modules to affect the request immediately after the request
* has been read, and before any other phases have been processes. This allows
@@ -567,7 +580,7 @@ AP_DECLARE(const char *) ap_method_name_of(apr_pool_t *p, int methnum);
* @return OK or DECLINED
*/
AP_DECLARE_HOOK(int,post_read_request,(request_rec *r))
-
+
/**
* This hook allows modules to perform any module-specific logging activities
* over and above the normal server things.
diff --git a/modules/examples/mod_example_hooks.c b/modules/examples/mod_example_hooks.c
index 256a6e8f4c..cbdf28ead4 100644
--- a/modules/examples/mod_example_hooks.c
+++ b/modules/examples/mod_example_hooks.c
@@ -1151,6 +1151,22 @@ static int x_process_connection(conn_rec *c)
* phases have been processed. This allows us to make decisions based upon
* the input header fields.
*
+ * This is a HOOK_VOID hook.
+ */
+void x_post_read_request(request_rec *r, conn_rec *c)
+{
+ /*
+ * We don't actually *do* anything here, except note the fact that we were
+ * called.
+ */
+ trace_request(r, "x_pre_read_request()");
+}
+
+/*
+ * This routine is called after the request has been read but before any other
+ * phases have been processed. This allows us to make decisions based upon
+ * the input header fields.
+ *
* This is a RUN_ALL hook.
*/
static int x_post_read_request(request_rec *r)
@@ -1449,6 +1465,8 @@ static void x_register_hooks(apr_pool_t *p)
ap_hook_quick_handler(x_quick_handler, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_pre_connection(x_pre_connection, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_process_connection(x_process_connection, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_pre_read_request(x_pre_read_request, NULL, NULL,
+ APR_HOOK_MIDDLE);
/* [1] post read_request handling */
ap_hook_post_read_request(x_post_read_request, NULL, NULL,
APR_HOOK_MIDDLE);
diff --git a/server/protocol.c b/server/protocol.c
index be9d183932..359f848f39 100644
--- a/server/protocol.c
+++ b/server/protocol.c
@@ -60,6 +60,7 @@
APLOG_USE_MODULE(core);
APR_HOOK_STRUCT(
+ APR_HOOK_LINK(pre_read_request)
APR_HOOK_LINK(post_read_request)
APR_HOOK_LINK(log_transaction)
APR_HOOK_LINK(http_scheme)
@@ -915,6 +916,8 @@ request_rec *ap_read_request(conn_rec *conn)
tmp_bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
+ ap_run_pre_read_request(r, conn);
+
/* Get the request... */
if (!read_request_line(r, tmp_bb)) {
if (r->status == HTTP_REQUEST_URI_TOO_LARGE
@@ -1733,6 +1736,9 @@ AP_DECLARE(void) ap_send_interim_response(request_rec *r, int send_headers)
}
+AP_IMPLEMENT_HOOK_VOID(pre_read_request,
+ (request_rec *r, conn_rec *c),
+ (r, c))
AP_IMPLEMENT_HOOK_RUN_ALL(int,post_read_request,
(request_rec *r), (r), OK, DECLINED)
AP_IMPLEMENT_HOOK_RUN_ALL(int,log_transaction,