]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
ab: Fix the detection for when the server performed a legitimate
authorGraham Leggett <minfrin@apache.org>
Wed, 9 Feb 2022 18:23:23 +0000 (18:23 +0000)
committerGraham Leggett <minfrin@apache.org>
Wed, 9 Feb 2022 18:23:23 +0000 (18:23 +0000)
connection close as per RFC7230 6.3.1. We must check whedther the
connection was previously kept alive, and not whether the current
closed request is keepalive.

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

changes-entries/ab-keepalivefix.txt [new file with mode: 0644]
support/ab.c

diff --git a/changes-entries/ab-keepalivefix.txt b/changes-entries/ab-keepalivefix.txt
new file mode 100644 (file)
index 0000000..ec68ead
--- /dev/null
@@ -0,0 +1,5 @@
+  *) ab: Fix the detection for when the server performed a legitimate
+     connection close as per RFC7230 6.3.1. We must check whedther the
+     connection was previously kept alive, and not whether the current
+     closed request is keepalive. [Graham Leggett]
+
index e9580ab58782e85bb69f127e3189ed83f47b0b64..bd44ead6ba0fa1cad5541dd5e128220a463ad46b 100644 (file)
@@ -273,6 +273,7 @@ struct connection {
                beginread,       /* First byte of input */
                done;            /* Connection closed */
 
+    apr_uint64_t keptalive;     /* subsequent keepalive requests */
     int socknum;
 #ifdef USE_SSL
     SSL *ssl;
@@ -738,6 +739,7 @@ static void ssl_proceed_handshake(struct connection *c)
 
     while (do_next) {
         int ret, ecode;
+        apr_status_t status;
 
         ret = SSL_do_handshake(c->ssl);
         ecode = SSL_get_error(c->ssl, ret);
@@ -825,7 +827,9 @@ static void ssl_proceed_handshake(struct connection *c)
         case SSL_ERROR_SSL:
         case SSL_ERROR_SYSCALL:
             /* Unexpected result */
-            BIO_printf(bio_err, "SSL handshake failed (%d).\n", ecode);
+            status = apr_get_netos_error();
+            BIO_printf(bio_err, "SSL handshake failed (%d): %s\n", ecode,
+                    apr_psprintf(c->ctx, "%pm", &status));
             ERR_print_errors(bio_err);
             close_connection(c);
             do_next = 0;
@@ -1406,6 +1410,7 @@ static void start_connect(struct connection * c)
     c->cbx = 0;
     c->gotheader = 0;
     c->rwrite = 0;
+    c->keptalive = 0;
     if (c->ctx) {
         apr_pool_clear(c->ctx);
     }
@@ -1528,9 +1533,10 @@ static void start_connect(struct connection * c)
 
 static void close_connection(struct connection * c)
 {
-    if (c->read == 0 && c->keepalive) {
+    if (c->read == 0 && c->keptalive) {
         /*
          * server has legitimately shut down an idle keep alive request
+         * as per RFC7230 6.3.1.
          */
         if (good)
             good--;     /* connection never happened */
@@ -1851,6 +1857,8 @@ read_more:
         /* zero connect time with keep-alive */
         c->start = c->connect = lasttime = apr_time_now();
 
+        c->keptalive++;
+
         write_request(c);
     }
 }