mirror of
https://github.com/apache/httpd.git
synced 2025-08-10 02:56:11 +00:00
NET_TIME, as a standalone feature, was a horrid idea.
The core filter will NOT operate correctly across platforms (even between Linux/Solaris) without setting up the conn->timeout, so always apply the timeout when establishing the core filter. The keep-alive-timeout is entirely an HTTP-ism, and needs to move to the http protocol handler. Note #1; this isn't triggered in the event mpm, but the event mpm introspects s->keep_alive_timeout directly adding it to the pollset, so this is a non-sequitor. Finally, once the headers are read, the named virtual host may have a different (more/less permissive) timeout for the remainder of the request body. This http-centric patch picks up that subtle detail and can switch to a named-vhost timeout. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@306495 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@ -106,12 +106,13 @@
|
||||
* 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 20050919
|
||||
#define MODULE_MAGIC_NUMBER_MAJOR 20051005
|
||||
#endif
|
||||
#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */
|
||||
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -181,11 +181,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) {
|
||||
csd = ap_get_module_config(c->conn_config, &core_module);
|
||||
}
|
||||
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;
|
||||
|
@ -91,7 +91,6 @@ AP_IMPLEMENT_HOOK_RUN_ALL(int, get_mgmt_items,
|
||||
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_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;
|
||||
|
||||
/* magic pointer for ErrorDocument xxx "default" */
|
||||
@ -3759,10 +3758,6 @@ 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);
|
||||
@ -3821,10 +3816,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
|
||||
@ -3841,6 +3835,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;
|
||||
@ -3887,9 +3895,6 @@ 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);
|
||||
|
@ -58,41 +58,6 @@
|
||||
|
||||
#define AP_MIN_SENDFILE_BYTES (256)
|
||||
|
||||
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.
|
||||
*/
|
||||
|
@ -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");
|
||||
@ -892,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) {
|
||||
@ -942,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;
|
||||
|
||||
|
Reference in New Issue
Block a user