Author: rhuijben
Date: Thu Nov  5 18:09:05 2015
New Revision: 1712839

URL: http://svn.apache.org/viewvc?rev=1712839&view=rev
Log:
Make the test suite a bit happier by moving the code that handles certain
specific error codes to the central error handling of
read_from_connection(), to also include the errors in the handling when
they are detected when peeking the connection.

It appears our recent changes make us detect some of these errors a bit
earlier.

* outgoing.c
  (read_from_connection): Handle the connection errors from peeking in
    the same way as the errors from processing the data in the response
    handling.

Modified:
    serf/trunk/outgoing.c

Modified: serf/trunk/outgoing.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/outgoing.c?rev=1712839&r1=1712838&r2=1712839&view=diff
==============================================================================
--- serf/trunk/outgoing.c (original)
+++ serf/trunk/outgoing.c Thu Nov  5 18:09:05 2015
@@ -1207,43 +1207,6 @@ static apr_status_t read_from_connection
             continue;
         }
 
-        /* Some systems will not generate a HUP poll event so we have to
-         * handle the ECONNRESET issue and ECONNABORT here.
-         */
-        if (APR_STATUS_IS_ECONNRESET(status) ||
-            APR_STATUS_IS_ECONNABORTED(status) ||
-            status == SERF_ERROR_REQUEST_LOST) {
-            /* If the connection had ever been good, be optimistic & try again.
-             * If it has never tried again (incl. a retry), fail.
-             */
-            if (conn->completed_responses) {
-                reset_connection(conn, 1);
-                status = APR_SUCCESS;
-            }
-            else if (status == SERF_ERROR_REQUEST_LOST) {
-                status = SERF_ERROR_ABORTED_CONNECTION;
-            }
-            goto error;
-        }
-
-        /* This connection uses HTTP pipelining and the server asked for a 
-           renegotiation (e.g. to access the requested resource a specific
-           client certificate is required).
-           Because of a known problem in OpenSSL this won't work most of the 
-           time, so as a workaround, when the server asks for a renegotiation
-           on a connection using HTTP pipelining, we reset the connection,
-           disable pipelining and reconnect to the server. */
-        if (status == SERF_ERROR_SSL_NEGOTIATE_IN_PROGRESS) {
-            serf__log(LOGLVL_WARNING, LOGCOMP_CONN, __FILE__, conn->config,
-                      "The server requested renegotiation. Disable HTTP "
-                      "pipelining and reset the connection.\n", conn);
-
-            serf__connection_set_pipelining(conn, 0);
-            reset_connection(conn, 1);
-            status = APR_SUCCESS;
-            goto error;
-        }
-
         /* If our response handler says it can't do anything more, we now
          * treat that as a success.
          */
@@ -1337,6 +1300,45 @@ static apr_status_t read_from_connection
     }
 
 error:
+    /* ### This code handles some specific errors as a retry.
+           Eventually we should move to a handling where the application
+           can tell us if this is really a good idea for specific requests */
+
+    if (status == SERF_ERROR_SSL_NEGOTIATE_IN_PROGRESS) {
+        /* This connection uses HTTP pipelining and the server asked for a
+           renegotiation (e.g. to access the requested resource a specific
+           client certificate is required).
+
+           Because of a known problem in OpenSSL this won't work most of the
+           time, so as a workaround, when the server asks for a renegotiation
+           on a connection using HTTP pipelining, we reset the connection,
+           disable pipelining and reconnect to the server. */
+        serf__log(LOGLVL_WARNING, LOGCOMP_CONN, __FILE__, conn->config,
+                  "The server requested renegotiation. Disable HTTP "
+                  "pipelining and reset the connection.\n", conn);
+
+        serf__connection_set_pipelining(conn, 0);
+        reset_connection(conn, 1);
+        status = APR_SUCCESS;
+    }
+    else if (status == SERF_ERROR_REQUEST_LOST
+             || APR_STATUS_IS_ECONNRESET(status)
+             || APR_STATUS_IS_ECONNABORTED(status)) {
+
+        /* Some systems will not generate a HUP poll event for these errors
+           so we handle the ECONNRESET issue and ECONNABORT here. */
+
+        /* If the connection was ever good, be optimistic & try again.
+           If it has never tried again (incl. a retry), fail. */
+        if (conn->completed_responses) {
+            reset_connection(conn, 1);
+            status = APR_SUCCESS;
+        }
+        else if (status == SERF_ERROR_REQUEST_LOST) {
+            status = SERF_ERROR_ABORTED_CONNECTION;
+        }
+    }
+
     apr_pool_destroy(tmppool);
     return status;
 }


Reply via email to