diff options
author | Brian Pane <brianp@apache.org> | 2005-10-06 06:19:12 +0000 |
---|---|---|
committer | Brian Pane <brianp@apache.org> | 2005-10-06 06:19:12 +0000 |
commit | 1000a35949273c5c4acda0688eb0366babf87e01 (patch) | |
tree | f65b118ecbdaf3b5eb96f31ae2d8bd8ab1813fd4 | |
parent | 846cbeee1c3ab5a81c6302340eff40439c477278 (diff) | |
download | httpd-1000a35949273c5c4acda0688eb0366babf87e01.tar.gz |
Forward-port of wrowe's NET_TIME filter removal/refactor into
the async-dev branch, in preparation for developing async write
completion in this branch on top of the new timeout design.
http://svn.apache.org/viewcvs.cgi?rev=306495&view=rev
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/async-dev@306541 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | include/ap_mmn.h | 8 | ||||
-rw-r--r-- | include/http_core.h | 4 | ||||
-rw-r--r-- | modules/http/http_core.c | 8 | ||||
-rw-r--r-- | server/core.c | 63 | ||||
-rw-r--r-- | server/core_filters.c | 35 | ||||
-rw-r--r-- | server/protocol.c | 26 |
6 files changed, 55 insertions, 89 deletions
diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 84dfebeb86..75164378c7 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -105,14 +105,16 @@ * 20050701.1 (2.1.7-dev) trace_enable member added to core server_config * 20050708.0 (2.1.7-dev) Bump MODULE_MAGIC_COOKIE to "AP22"! * 20050708.1 (2.1.7-dev) add proxy request_status hook (minor) - */ + * 20050919.0 (2.1.8-dev) mod_ssl ssl_ext_list optional function added + * 20051005.0 (2.1.8-dev) NET_TIME filter eliminated + */ #define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */ #ifndef MODULE_MAGIC_NUMBER_MAJOR -#define MODULE_MAGIC_NUMBER_MAJOR 20050708 +#define MODULE_MAGIC_NUMBER_MAJOR 20051005 #endif -#define MODULE_MAGIC_NUMBER_MINOR 1 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/http_core.h b/include/http_core.h index ecf7b9d037..9060cb7a4e 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -600,9 +600,6 @@ AP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config); AP_CORE_DECLARE_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, void *dummy, const char *arg); /* Core filters; not exported. */ -int ap_net_time_filter(ap_filter_t *f, apr_bucket_brigade *b, - ap_input_mode_t mode, apr_read_type_e block, - apr_off_t readbytes); int ap_core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes); @@ -641,7 +638,6 @@ typedef struct { extern AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle; extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle; extern AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle; -extern AP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle; extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle; /** diff --git a/modules/http/http_core.c b/modules/http/http_core.c index a414e6be47..894edd2d34 100644 --- a/modules/http/http_core.c +++ b/modules/http/http_core.c @@ -157,7 +157,6 @@ static int ap_process_http_async_connection(conn_rec *c) static int ap_process_http_connection(conn_rec *c) { request_rec *r; - int csd_set = 0; apr_socket_t *csd = NULL; /* @@ -186,12 +185,13 @@ static int ap_process_http_connection(conn_rec *c) if (ap_graceful_stop_signalled()) break; - /* Go straight to select() to wait for the next request */ - if (!csd_set) { + + if (!csd) { csd = ap_get_module_config(c->conn_config, &core_module); - csd_set = 1; } apr_socket_opt_set(csd, APR_INCOMPLETE_READ, 1); + apr_socket_timeout_set(csd, c->base_server->keep_alive_timeout); + /* Go straight to select() to wait for the next request */ } return OK; diff --git a/server/core.c b/server/core.c index 589c770f63..7d9484328d 100644 --- a/server/core.c +++ b/server/core.c @@ -21,7 +21,6 @@ #include "apr_hash.h" #include "apr_thread_proc.h" /* for RLIMIT stuff */ #include "apr_hooks.h" -#include "apr_optional.h" #define APR_WANT_IOVEC #define APR_WANT_STRFUNC @@ -49,7 +48,6 @@ #include "mod_core.h" #include "mod_proxy.h" #include "ap_listen.h" -#include "ap_mpm.h" #include "mod_so.h" /* for ap_find_loaded_module_symbol */ @@ -92,13 +90,9 @@ AP_IMPLEMENT_HOOK_RUN_ALL(int, get_mgmt_items, /* Handles for core filters */ AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle; AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle; -AP_DECLARE_DATA ap_filter_rec_t *ap_core_mpm_write_filter_handle; AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle; -AP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle; AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle; -static APR_OPTIONAL_FN_TYPE(ap_mpm_custom_write_filter) *mpm_write_func; - /* magic pointer for ErrorDocument xxx "default" */ static char errordocument_default; @@ -3681,25 +3675,9 @@ APR_OPTIONAL_FN_TYPE(ap_logio_add_bytes_out) *logio_add_bytes_out; static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { - int mpm_write = 0; - logio_add_bytes_out = APR_RETRIEVE_OPTIONAL_FN(ap_logio_add_bytes_out); ident_lookup = APR_RETRIEVE_OPTIONAL_FN(ap_ident_lookup); - if (ap_mpm_query(AP_MPMQ_CUSTOM_WRITE, &mpm_write) == APR_SUCCESS - && mpm_write == 1) { - mpm_write_func = APR_RETRIEVE_OPTIONAL_FN(ap_mpm_custom_write_filter); - - ap_core_output_filter_handle = - ap_register_output_filter("CORE", mpm_write_func, - NULL, AP_FTYPE_NETWORK); - } - else { - ap_core_output_filter_handle = - ap_register_output_filter("CORE", ap_core_output_filter, - NULL, AP_FTYPE_NETWORK); - } - ap_set_version(pconf); ap_setup_make_content_type(pconf); return OK; @@ -3780,19 +3758,10 @@ static int core_create_req(request_rec *r) } else { req_cfg->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); - if (!r->prev) { - ap_add_input_filter_handle(ap_net_time_filter_handle, - NULL, r, r->connection); - } } ap_set_module_config(r->request_config, &core_module, req_cfg); - /* Begin by presuming any module can make its own path_info assumptions, - * until some module interjects and changes the value. - */ - r->used_path_info = AP_REQ_DEFAULT_PATH_INFO; - return OK; } @@ -3840,7 +3809,7 @@ static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server, c->id = id; c->bucket_alloc = alloc; - + c->cs = (conn_state_t *)apr_pcalloc(ptrans, sizeof(conn_state_t)); APR_RING_INIT(&(c->cs->timeout_list), conn_state_t, timeout_list); c->cs->expiration_time = 0; @@ -3855,10 +3824,9 @@ static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server, static int core_pre_connection(conn_rec *c, void *csd) { core_net_rec *net = apr_palloc(c->pool, sizeof(*net)); - -#ifdef AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK apr_status_t rv; +#ifdef AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK /* The Nagle algorithm says that we should delay sending partial * packets in hopes of getting more data. We don't want to do * this; we are not telnet. There are bad interactions between @@ -3875,6 +3843,20 @@ static int core_pre_connection(conn_rec *c, void *csd) "apr_socket_opt_set(APR_TCP_NODELAY)"); } #endif + + /* The core filter requires the timeout mode to be set, which + * incidentally sets the socket to be nonblocking. If this + * is not initialized correctly, Linux - for example - will + * be initially blocking, while Solaris will be non blocking + * and any initial read will fail. + */ + rv = apr_socket_timeout_set(csd, c->base_server->timeout); + if (rv != APR_SUCCESS) { + /* expected cause is that the client disconnected already */ + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, rv, c, + "apr_socket_timeout_set"); + } + net->c = c; net->in_ctx = NULL; net->out_ctx = NULL; @@ -3882,10 +3864,7 @@ static int core_pre_connection(conn_rec *c, void *csd) ap_set_module_config(net->c->conn_config, &core_module, csd); ap_add_input_filter_handle(ap_core_input_filter_handle, net, NULL, net->c); - - ap_add_output_filter_handle(ap_core_output_filter_handle, net, - NULL, net->c); - + ap_add_output_filter_handle(ap_core_output_filter_handle, net, NULL, net->c); return DONE; } @@ -3924,14 +3903,12 @@ static void register_hooks(apr_pool_t *p) ap_core_input_filter_handle = ap_register_input_filter("CORE_IN", ap_core_input_filter, NULL, AP_FTYPE_NETWORK); - ap_net_time_filter_handle = - ap_register_input_filter("NET_TIME", ap_net_time_filter, - NULL, AP_FTYPE_PROTOCOL); ap_content_length_filter_handle = ap_register_output_filter("CONTENT_LENGTH", ap_content_length_filter, NULL, AP_FTYPE_PROTOCOL); - - + ap_core_output_filter_handle = + ap_register_output_filter("CORE", ap_core_output_filter, + NULL, AP_FTYPE_NETWORK); ap_subreq_core_filter_handle = ap_register_output_filter("SUBREQ_CORE", ap_sub_req_output_filter, NULL, AP_FTYPE_CONTENT_SET); diff --git a/server/core_filters.c b/server/core_filters.c index 677728fe60..05341c3d6b 100644 --- a/server/core_filters.c +++ b/server/core_filters.c @@ -60,41 +60,6 @@ #define AP_MIN_SENDFILE_BYTES (256) // #define APR_HAS_SENDFILE 0 -typedef struct net_time_filter_ctx { - apr_socket_t *csd; - int first_line; -} net_time_filter_ctx_t; - -int ap_net_time_filter(ap_filter_t *f, apr_bucket_brigade *b, - ap_input_mode_t mode, apr_read_type_e block, - apr_off_t readbytes) -{ - net_time_filter_ctx_t *ctx = f->ctx; - int keptalive = f->c->keepalive == AP_CONN_KEEPALIVE; - - if (!ctx) { - f->ctx = ctx = apr_palloc(f->r->pool, sizeof(*ctx)); - ctx->first_line = 1; - ctx->csd = ap_get_module_config(f->c->conn_config, &core_module); - } - - if (mode != AP_MODE_INIT && mode != AP_MODE_EATCRLF) { - if (ctx->first_line) { - apr_socket_timeout_set(ctx->csd, - keptalive - ? f->c->base_server->keep_alive_timeout - : f->c->base_server->timeout); - ctx->first_line = 0; - } - else { - if (keptalive) { - apr_socket_timeout_set(ctx->csd, f->c->base_server->timeout); - } - } - } - return ap_get_brigade(f->next, b, mode, block, readbytes); -} - /** * Remove all zero length buckets from the brigade. */ diff --git a/server/protocol.c b/server/protocol.c index 4efe8c44a9..e440ced174 100644 --- a/server/protocol.c +++ b/server/protocol.c @@ -832,6 +832,8 @@ request_rec *ap_read_request(conn_rec *conn) const char *expect; int access_status; apr_bucket_brigade *tmp_bb; + apr_socket_t *csd; + apr_interval_time_t cur_timeout; apr_pool_create(&p, conn->pool); apr_pool_tag(p, "request"); @@ -869,6 +871,11 @@ request_rec *ap_read_request(conn_rec *conn) r->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */ r->the_request = NULL; + /* Begin by presuming any module can make its own path_info assumptions, + * until some module interjects and changes the value. + */ + r->used_path_info = AP_REQ_DEFAULT_PATH_INFO; + tmp_bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); /* Get the request... */ @@ -887,6 +894,17 @@ request_rec *ap_read_request(conn_rec *conn) return NULL; } + /* We may have been in keep_alive_timeout mode, so toggle back + * to the normal timeout mode as we fetch the header lines, + * as necessary. + */ + csd = ap_get_module_config(conn->conn_config, &core_module); + apr_socket_timeout_get(csd, &cur_timeout); + if (cur_timeout != conn->base_server->timeout) { + apr_socket_timeout_set(csd, conn->base_server->timeout); + cur_timeout = conn->base_server->timeout; + } + if (!r->assbackwards) { ap_get_mime_headers_core(r, tmp_bb); if (r->status != HTTP_REQUEST_TIME_OUT) { @@ -937,6 +955,14 @@ request_rec *ap_read_request(conn_rec *conn) */ ap_update_vhost_from_headers(r); + /* Toggle to the Host:-based vhost's timeout mode to fetch the + * request body and send the response body, if needed. + */ + if (cur_timeout != r->server->timeout) { + apr_socket_timeout_set(csd, r->server->timeout); + cur_timeout = r->server->timeout; + } + /* we may have switched to another server */ r->per_dir_config = r->server->lookup_defaults; |