From: Jim Jagielski Date: Mon, 14 Feb 2011 19:21:37 +0000 (+0000) Subject: New hook: ap_run_pre_read_request() X-Git-Tag: 2.3.11~61 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=917522448250d28cbb4b804ba00e45147d056c0b;p=apache 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 --- 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 @@ -1146,6 +1146,22 @@ static int x_process_connection(conn_rec *c) return DECLINED; } +/* + * 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 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 @@ -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,