]> granicus.if.org Git - apache/commitdiff
mpm_event[opt]: Send the SSL close notify alert when the KeepAliveTimeout
authorYann Ylavic <ylavic@apache.org>
Sat, 7 Jun 2014 22:57:08 +0000 (22:57 +0000)
committerYann Ylavic <ylavic@apache.org>
Sat, 7 Jun 2014 22:57:08 +0000 (22:57 +0000)
                expires. PR54998.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1601185 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
include/ap_mmn.h
include/http_connection.h
server/connection.c
server/mpm/event/event.c
server/mpm/eventopt/eventopt.c

diff --git a/CHANGES b/CHANGES
index 4ef66ba0d276cf57b9eb23751eecaef3a3d07f3b..52af761c883757a7d90a7888c13f7f3996160ad1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mpm_event[opt]: Send the SSL close notify alert when the KeepAliveTimeout
+     expires. PR54998. [Yann Ylavic] 
+
   *) mod_ssl: Ensure that the SSL close notify alert is flushed to the client.
      PR54998. [Tim Kosse <tim.kosse filezilla-project.org>, Yann Ylavic] 
 
index 7ba28e13fd5552a4753b458b86222d1eddd2ef1c..55cc96395db382b85b4c35ce302489cba9e283ee 100644 (file)
  *                         ap_mpm_query(), and suspended_baton to conn_rec
  * 20140207.6 (2.5.0-dev)  Added ap_log_common().
  * 20140207.7 (2.5.0-dev)  Added ap_force_set_tz().
+ * 20140207.8 (2.5.0-dev)  Added ap_shutdown_conn().
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20140207
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 7                  /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 8                  /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index f73670b442dc36ff97a11b89374060eaee5ad50c..571bf57d2a66f6fa05ee5e6bb2e18e08da987d47 100644 (file)
@@ -47,9 +47,18 @@ extern "C" {
  */
 AP_CORE_DECLARE(void) ap_process_connection(conn_rec *c, void *csd);
 
+/**
+ * Shutdown the connection for writing.
+ * @param c The connection to shutdown
+ * @param flush Whether or not to flush pending data before
+ * @return APR_SUCCESS or the underlying error
+ */
+AP_CORE_DECLARE(apr_status_t) ap_shutdown_conn(conn_rec *c, int flush);
+
 /**
  * Flushes all remain data in the client send buffer
  * @param c The connection to flush
+ * @remark calls ap_shutdown_conn(c, 1)
  */
 AP_CORE_DECLARE(void) ap_flush_conn(conn_rec *c);
 
index 44544c7d8d5183e58a2c2d52322be1838a212b55..4f862e4ece611b7ebb2263897b5f01a7756e3548 100644 (file)
@@ -64,22 +64,32 @@ AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_connection,(conn_rec *c, void *csd),(c, csd),O
 #define MAX_SECS_TO_LINGER 30
 #endif
 
-AP_CORE_DECLARE(void) ap_flush_conn(conn_rec *c)
+AP_CORE_DECLARE(apr_status_t) ap_shutdown_conn(conn_rec *c, int flush)
 {
+    apr_status_t rv;
     apr_bucket_brigade *bb;
     apr_bucket *b;
 
     bb = apr_brigade_create(c->pool, c->bucket_alloc);
 
-    /* FLUSH bucket */
-    b = apr_bucket_flush_create(c->bucket_alloc);
-    APR_BRIGADE_INSERT_TAIL(bb, b);
+    if (flush) {
+        /* FLUSH bucket */
+        b = apr_bucket_flush_create(c->bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(bb, b);
+    }
 
     /* End Of Connection bucket */
     b = ap_bucket_eoc_create(c->bucket_alloc);
     APR_BRIGADE_INSERT_TAIL(bb, b);
 
-    ap_pass_brigade(c->output_filters, bb);
+    rv = ap_pass_brigade(c->output_filters, bb);
+    apr_brigade_destroy(bb);
+    return rv;
+}
+
+AP_CORE_DECLARE(void) ap_flush_conn(conn_rec *c)
+{
+    (void)ap_shutdown_conn(c, 1);
 }
 
 /* we now proceed to read from the client until we get EOF, or until
index c937b319f8847fb50a1b338d1b2d61281ae9ed0c..2f5229aaa241331e5dfaafcf4d3034af23c67f60 100644 (file)
@@ -895,6 +895,7 @@ static int start_lingering_close_nonblocking(event_conn_state_t *cs)
     apr_socket_t *csd = cs->pfd.desc.s;
 
     if (c->aborted
+        || ap_shutdown_conn(c, 0) != APR_SUCCESS || c->aborted
         || apr_socket_shutdown(csd, APR_SHUTDOWN_WRITE) != APR_SUCCESS) {
         apr_socket_close(csd);
         apr_pool_clear(cs->p);
index 4d3794a927e563677cbd48858bab89a30277b3a5..a42eb62aa1cc54be4c43cfbc89cb904632d9e8d8 100644 (file)
@@ -930,6 +930,7 @@ static int start_lingering_close_nonblocking(event_conn_state_t *cs, ap_equeue_t
     apr_socket_t *csd = cs->pfd.desc.s;
 
     if (c->aborted
+        || ap_shutdown_conn(c, 0) != APR_SUCCESS || c->aborted
         || apr_socket_shutdown(csd, APR_SHUTDOWN_WRITE) != APR_SUCCESS) {
         apr_socket_close(csd);
         apr_pool_clear(cs->p);