summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Pane <brianp@apache.org>2005-10-06 06:19:12 +0000
committerBrian Pane <brianp@apache.org>2005-10-06 06:19:12 +0000
commit1000a35949273c5c4acda0688eb0366babf87e01 (patch)
treef65b118ecbdaf3b5eb96f31ae2d8bd8ab1813fd4
parent846cbeee1c3ab5a81c6302340eff40439c477278 (diff)
downloadhttpd-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.h8
-rw-r--r--include/http_core.h4
-rw-r--r--modules/http/http_core.c8
-rw-r--r--server/core.c63
-rw-r--r--server/core_filters.c35
-rw-r--r--server/protocol.c26
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;