mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
core, mod_ssl: Lift the restriction that prevents mod_ssl taking
full advantage of the event MPM. Enable the ability for a module to reverse the sense of a poll event from a read to a write or vice versa. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1470679 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
5
CHANGES
5
CHANGES
@@ -1,6 +1,11 @@
|
|||||||
-*- coding: utf-8 -*-
|
-*- coding: utf-8 -*-
|
||||||
Changes with Apache 2.5.0
|
Changes with Apache 2.5.0
|
||||||
|
|
||||||
|
*) core, mod_ssl: Lift the restriction that prevents mod_ssl taking
|
||||||
|
full advantage of the event MPM. Enable the ability for a module
|
||||||
|
to reverse the sense of a poll event from a read to a write or vice
|
||||||
|
versa. [Graham Leggett]
|
||||||
|
|
||||||
*) core: Add workaround for gcc bug on sparc/64bit. PR 52900.
|
*) core: Add workaround for gcc bug on sparc/64bit. PR 52900.
|
||||||
[Stefan Fritsch]
|
[Stefan Fritsch]
|
||||||
|
|
||||||
|
@@ -420,6 +420,7 @@
|
|||||||
* ap_proxy_pass_brigade()
|
* ap_proxy_pass_brigade()
|
||||||
* 20121222.7 (2.5.0-dev) Add ap_remove_input|output_filter_byhandle()
|
* 20121222.7 (2.5.0-dev) Add ap_remove_input|output_filter_byhandle()
|
||||||
* 20121222.8 (2.5.0-dev) Add dav_join_error()
|
* 20121222.8 (2.5.0-dev) Add dav_join_error()
|
||||||
|
* 20121222.9 (2.5.0-dev) Add conn_sense_e
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
|
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
|
||||||
@@ -427,7 +428,7 @@
|
|||||||
#ifndef MODULE_MAGIC_NUMBER_MAJOR
|
#ifndef MODULE_MAGIC_NUMBER_MAJOR
|
||||||
#define MODULE_MAGIC_NUMBER_MAJOR 20121222
|
#define MODULE_MAGIC_NUMBER_MAJOR 20121222
|
||||||
#endif
|
#endif
|
||||||
#define MODULE_MAGIC_NUMBER_MINOR 8 /* 0...n */
|
#define MODULE_MAGIC_NUMBER_MINOR 9 /* 0...n */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
|
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
|
||||||
|
@@ -1177,12 +1177,20 @@ typedef enum {
|
|||||||
CONN_STATE_LINGER_SHORT /* MPM has started lingering close with short timeout */
|
CONN_STATE_LINGER_SHORT /* MPM has started lingering close with short timeout */
|
||||||
} conn_state_e;
|
} conn_state_e;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CONN_SENSE_DEFAULT,
|
||||||
|
CONN_SENSE_WANT_READ, /* next event must be read */
|
||||||
|
CONN_SENSE_WANT_WRITE /* next event must be write */
|
||||||
|
} conn_sense_e;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A structure to contain connection state information
|
* @brief A structure to contain connection state information
|
||||||
*/
|
*/
|
||||||
struct conn_state_t {
|
struct conn_state_t {
|
||||||
/** Current state of the connection */
|
/** Current state of the connection */
|
||||||
conn_state_e state;
|
conn_state_e state;
|
||||||
|
/** Whether to read instead of write, or write instead of read */
|
||||||
|
conn_sense_e sense;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Per-vhost config... */
|
/* Per-vhost config... */
|
||||||
|
@@ -777,6 +777,18 @@ static apr_status_t ssl_filter_write(ap_filter_t *f,
|
|||||||
*/
|
*/
|
||||||
outctx->rc = APR_EAGAIN;
|
outctx->rc = APR_EAGAIN;
|
||||||
}
|
}
|
||||||
|
else if (ssl_err == SSL_ERROR_WANT_READ) {
|
||||||
|
/*
|
||||||
|
* If OpenSSL wants to read during write, and we were
|
||||||
|
* nonblocking, set the sense explicitly to read and
|
||||||
|
* report as an EAGAIN.
|
||||||
|
*
|
||||||
|
* (This is usually the case when the client forces an SSL
|
||||||
|
* renegotiation which is handled implicitly by OpenSSL.)
|
||||||
|
*/
|
||||||
|
outctx->c->cs->sense = CONN_SENSE_WANT_READ;
|
||||||
|
outctx->rc = APR_EAGAIN;
|
||||||
|
}
|
||||||
else if (ssl_err == SSL_ERROR_SYSCALL) {
|
else if (ssl_err == SSL_ERROR_SYSCALL) {
|
||||||
ap_log_cerror(APLOG_MARK, APLOG_INFO, outctx->rc, c, APLOGNO(01993)
|
ap_log_cerror(APLOG_MARK, APLOG_INFO, outctx->rc, c, APLOGNO(01993)
|
||||||
"SSL output filter write failed.");
|
"SSL output filter write failed.");
|
||||||
@@ -1927,8 +1939,10 @@ void ssl_io_filter_init(conn_rec *c, request_rec *r, SSL *ssl)
|
|||||||
filter_ctx->pbioWrite = BIO_new(&bio_filter_out_method);
|
filter_ctx->pbioWrite = BIO_new(&bio_filter_out_method);
|
||||||
filter_ctx->pbioWrite->ptr = (void *)bio_filter_out_ctx_new(filter_ctx, c);
|
filter_ctx->pbioWrite->ptr = (void *)bio_filter_out_ctx_new(filter_ctx, c);
|
||||||
|
|
||||||
/* We insert a clogging input filter. Let the core know. */
|
/* write is non blocking for the benefit of async mpm */
|
||||||
c->clogging_input_filters = 1;
|
if (c->cs) {
|
||||||
|
BIO_set_nbio(filter_ctx->pbioWrite, 1);
|
||||||
|
}
|
||||||
|
|
||||||
ssl_io_input_add_filter(filter_ctx, c, r, ssl);
|
ssl_io_input_add_filter(filter_ctx, c, r, ssl);
|
||||||
|
|
||||||
|
@@ -810,7 +810,10 @@ static int start_lingering_close_common(event_conn_state_t *cs)
|
|||||||
apr_atomic_inc32(&lingering_count);
|
apr_atomic_inc32(&lingering_count);
|
||||||
apr_thread_mutex_lock(timeout_mutex);
|
apr_thread_mutex_lock(timeout_mutex);
|
||||||
TO_QUEUE_APPEND(*q, cs);
|
TO_QUEUE_APPEND(*q, cs);
|
||||||
cs->pfd.reqevents = APR_POLLIN | APR_POLLHUP | APR_POLLERR;
|
cs->pfd.reqevents = (
|
||||||
|
cs->pub.sense == CONN_SENSE_WANT_WRITE ? APR_POLLOUT :
|
||||||
|
APR_POLLIN) | APR_POLLHUP | APR_POLLERR;
|
||||||
|
cs->pub.sense = CONN_SENSE_DEFAULT;
|
||||||
rv = apr_pollset_add(event_pollset, &cs->pfd);
|
rv = apr_pollset_add(event_pollset, &cs->pfd);
|
||||||
apr_thread_mutex_unlock(timeout_mutex);
|
apr_thread_mutex_unlock(timeout_mutex);
|
||||||
if (rv != APR_SUCCESS && !APR_STATUS_IS_EEXIST(rv)) {
|
if (rv != APR_SUCCESS && !APR_STATUS_IS_EEXIST(rv)) {
|
||||||
@@ -958,6 +961,7 @@ static void process_socket(apr_thread_t *thd, apr_pool_t * p, apr_socket_t * soc
|
|||||||
*/
|
*/
|
||||||
cs->pub.state = CONN_STATE_READ_REQUEST_LINE;
|
cs->pub.state = CONN_STATE_READ_REQUEST_LINE;
|
||||||
|
|
||||||
|
cs->pub.sense = CONN_SENSE_DEFAULT;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c = cs->c;
|
c = cs->c;
|
||||||
@@ -966,9 +970,11 @@ static void process_socket(apr_thread_t *thd, apr_pool_t * p, apr_socket_t * soc
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (c->clogging_input_filters && !c->aborted) {
|
if (c->clogging_input_filters && !c->aborted) {
|
||||||
/* Since we have an input filter which 'cloggs' the input stream,
|
/* Since we have an input filter which 'clogs' the input stream,
|
||||||
* like mod_ssl, lets just do the normal read from input filters,
|
* like mod_ssl used to, lets just do the normal read from input
|
||||||
* like the Worker MPM does.
|
* filters, like the Worker MPM does. Filters that need to write
|
||||||
|
* where they would otherwise read, or read where they would
|
||||||
|
* otherwise write, should set the sense appropriately.
|
||||||
*/
|
*/
|
||||||
apr_atomic_inc32(&clogged_count);
|
apr_atomic_inc32(&clogged_count);
|
||||||
ap_run_process_connection(c);
|
ap_run_process_connection(c);
|
||||||
@@ -1014,7 +1020,10 @@ read_request:
|
|||||||
cs->expiration_time = ap_server_conf->timeout + apr_time_now();
|
cs->expiration_time = ap_server_conf->timeout + apr_time_now();
|
||||||
apr_thread_mutex_lock(timeout_mutex);
|
apr_thread_mutex_lock(timeout_mutex);
|
||||||
TO_QUEUE_APPEND(write_completion_q, cs);
|
TO_QUEUE_APPEND(write_completion_q, cs);
|
||||||
cs->pfd.reqevents = APR_POLLOUT | APR_POLLHUP | APR_POLLERR;
|
cs->pfd.reqevents = (
|
||||||
|
cs->pub.sense == CONN_SENSE_WANT_READ ? APR_POLLIN :
|
||||||
|
APR_POLLOUT) | APR_POLLHUP | APR_POLLERR;
|
||||||
|
cs->pub.sense = CONN_SENSE_DEFAULT;
|
||||||
rc = apr_pollset_add(event_pollset, &cs->pfd);
|
rc = apr_pollset_add(event_pollset, &cs->pfd);
|
||||||
apr_thread_mutex_unlock(timeout_mutex);
|
apr_thread_mutex_unlock(timeout_mutex);
|
||||||
return;
|
return;
|
||||||
|
@@ -875,7 +875,10 @@ static int start_lingering_close(event_conn_state_t *cs, ap_equeue_t *eq)
|
|||||||
cs->pub.state = CONN_STATE_LINGER_NORMAL;
|
cs->pub.state = CONN_STATE_LINGER_NORMAL;
|
||||||
}
|
}
|
||||||
apr_atomic_inc32(&lingering_count);
|
apr_atomic_inc32(&lingering_count);
|
||||||
cs->pfd.reqevents = APR_POLLIN | APR_POLLHUP | APR_POLLERR;
|
cs->pfd.reqevents = (
|
||||||
|
cs->pub.sense == CONN_SENSE_WANT_WRITE ? APR_POLLOUT :
|
||||||
|
APR_POLLIN) | APR_POLLHUP | APR_POLLERR;
|
||||||
|
cs->pub.sense = CONN_SENSE_DEFAULT;
|
||||||
v->cs = cs;
|
v->cs = cs;
|
||||||
if (eq != NULL) {
|
if (eq != NULL) {
|
||||||
ap_equeue_writer_onward(eq);
|
ap_equeue_writer_onward(eq);
|
||||||
@@ -1019,6 +1022,7 @@ static void process_socket(apr_thread_t *thd, apr_pool_t * p, apr_socket_t * soc
|
|||||||
*/
|
*/
|
||||||
cs->pub.state = CONN_STATE_READ_REQUEST_LINE;
|
cs->pub.state = CONN_STATE_READ_REQUEST_LINE;
|
||||||
|
|
||||||
|
cs->pub.sense = CONN_SENSE_DEFAULT;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c = cs->c;
|
c = cs->c;
|
||||||
@@ -1027,9 +1031,11 @@ static void process_socket(apr_thread_t *thd, apr_pool_t * p, apr_socket_t * soc
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (c->clogging_input_filters && !c->aborted) {
|
if (c->clogging_input_filters && !c->aborted) {
|
||||||
/* Since we have an input filter which 'cloggs' the input stream,
|
/* Since we have an input filter which 'clogs' the input stream,
|
||||||
* like mod_ssl, lets just do the normal read from input filters,
|
* like mod_ssl used to, lets just do the normal read from input
|
||||||
* like the Worker MPM does.
|
* filters, like the Worker MPM does. Filters that need to write
|
||||||
|
* where they would otherwise read, or read where they would
|
||||||
|
* otherwise write, should set the sense appropriately.
|
||||||
*/
|
*/
|
||||||
apr_atomic_inc32(&clogged_count);
|
apr_atomic_inc32(&clogged_count);
|
||||||
ap_run_process_connection(c);
|
ap_run_process_connection(c);
|
||||||
@@ -1075,7 +1081,10 @@ read_request:
|
|||||||
pollset_op_t *v = ap_equeue_writer_value(eq);
|
pollset_op_t *v = ap_equeue_writer_value(eq);
|
||||||
|
|
||||||
cs->expiration_time = ap_server_conf->timeout + apr_time_now();
|
cs->expiration_time = ap_server_conf->timeout + apr_time_now();
|
||||||
cs->pfd.reqevents = APR_POLLOUT | APR_POLLHUP | APR_POLLERR;
|
cs->pfd.reqevents = (
|
||||||
|
cs->pub.sense == CONN_SENSE_WANT_READ ? APR_POLLIN :
|
||||||
|
APR_POLLOUT) | APR_POLLHUP | APR_POLLERR;
|
||||||
|
cs->pub.sense = CONN_SENSE_DEFAULT;
|
||||||
|
|
||||||
v->cs = cs;
|
v->cs = cs;
|
||||||
v->timeout_type = TIMEOUT_WRITE_COMPLETION;
|
v->timeout_type = TIMEOUT_WRITE_COMPLETION;
|
||||||
|
Reference in New Issue
Block a user