summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base.h1
-rw-r--r--src/configfile.c6
-rw-r--r--src/connections-glue.c6
-rw-r--r--src/network.c2
4 files changed, 12 insertions, 3 deletions
diff --git a/src/base.h b/src/base.h
index 12585ef3..134fc411 100644
--- a/src/base.h
+++ b/src/base.h
@@ -295,6 +295,7 @@ typedef struct {
buffer *ssl_verifyclient_username;
unsigned short ssl_verifyclient_export_cert;
unsigned short ssl_disable_client_renegotiation;
+ unsigned short ssl_read_ahead;
unsigned short use_ipv6, set_v6only; /* set_v6only is only a temporary option */
unsigned short defer_accept;
diff --git a/src/configfile.c b/src/configfile.c
index f40248f3..bba69250 100644
--- a/src/configfile.c
+++ b/src/configfile.c
@@ -144,6 +144,7 @@ static int config_insert(server *srv) {
{ "server.stream-request-body", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 76 */
{ "server.stream-response-body", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 77 */
{ "server.max-request-field-size", NULL, T_CONFIG_INT, T_CONFIG_SCOPE_SERVER }, /* 78 */
+ { "ssl.read-ahead", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 79 */
{ NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
};
@@ -247,6 +248,7 @@ static int config_insert(server *srv) {
s->ssl_verifyclient_depth = 9;
s->ssl_verifyclient_export_cert = 0;
s->ssl_disable_client_renegotiation = 1;
+ s->ssl_read_ahead = (0 == i ? 1 : srv->config_storage[0]->ssl_read_ahead);
s->listen_backlog = (0 == i ? 1024 : srv->config_storage[0]->listen_backlog);
s->stream_request_body = 0;
s->stream_response_body = 0;
@@ -315,6 +317,7 @@ static int config_insert(server *srv) {
#endif
cv[76].destination = &(s->stream_request_body);
cv[77].destination = &(s->stream_response_body);
+ cv[79].destination = &(s->ssl_read_ahead);
srv->config_storage[i] = s;
@@ -543,6 +546,7 @@ int config_setup_connection(server *srv, connection *con) {
PATCH(ssl_verifyclient_username);
PATCH(ssl_verifyclient_export_cert);
PATCH(ssl_disable_client_renegotiation);
+ PATCH(ssl_read_ahead);
return 0;
}
@@ -671,6 +675,8 @@ int config_patch_connection(server *srv, connection *con) {
PATCH(ssl_verifyclient_export_cert);
} else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.disable-client-renegotiation"))) {
PATCH(ssl_disable_client_renegotiation);
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.read-ahead"))) {
+ PATCH(ssl_read_ahead);
}
}
}
diff --git a/src/connections-glue.c b/src/connections-glue.c
index d30c229a..80104b67 100644
--- a/src/connections-glue.c
+++ b/src/connections-glue.c
@@ -127,7 +127,7 @@ static int connection_handle_read_ssl(server *srv, connection *con) {
connection_set_state(srv, con, CON_STATE_ERROR);
return -1;
}
- } while (len > 0);
+ } while (len > 0 && (con->conf.ssl_read_ahead || SSL_pending(con->ssl) > 0));
if (len < 0) {
int oerrno = errno;
@@ -206,11 +206,13 @@ static int connection_handle_read_ssl(server *srv, connection *con) {
connection_set_state(srv, con, CON_STATE_ERROR);
return -1;
- } else { /*(len == 0)*/
+ } else if (len == 0) {
con->is_readable = 0;
/* the other end close the connection -> KEEP-ALIVE */
return -2;
+ } else {
+ return 0;
}
#else
UNUSED(srv);
diff --git a/src/network.c b/src/network.c
index b46dcf71..4295fe96 100644
--- a/src/network.c
+++ b/src/network.c
@@ -994,7 +994,7 @@ int network_init(server *srv) {
s->ssl_pemfile);
return -1;
}
- SSL_CTX_set_default_read_ahead(s->ssl_ctx, 1);
+ SSL_CTX_set_default_read_ahead(s->ssl_ctx, s->ssl_read_ahead);
SSL_CTX_set_mode(s->ssl_ctx, SSL_CTX_get_mode(s->ssl_ctx)
| SSL_MODE_ENABLE_PARTIAL_WRITE
| SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER