https://bugzilla.redhat.com/show_bug.cgi?id=1130328 https://issues.apache.org/jira/browse/SERF-190 --- serf-1.3.9/outgoing.c.ipv6fail 2015-10-17 13:25:14.000000000 +0100 +++ serf-1.3.9/outgoing.c 2019-04-16 11:31:53.586762388 +0100 @@ -1264,17 +1264,6 @@ apr_status_t serf__process_connection(se return APR_SUCCESS; } } - if ((events & APR_POLLHUP) != 0) { - /* The connection got reset by the server. On Windows this can happen - when all data is read, so just cleanup the connection and open - a new one. - If we haven't had any successful responses on this connection, - then error out as it is likely a server issue. */ - if (conn->completed_responses) { - return reset_connection(conn, 1); - } - return SERF_ERROR_ABORTED_CONNECTION; - } if ((events & APR_POLLERR) != 0) { /* We might be talking to a buggy HTTP server that doesn't * do lingering-close. (httpd < 2.1.8 does this.) @@ -1292,11 +1281,15 @@ apr_status_t serf__process_connection(se { apr_os_sock_t osskt; if (!apr_os_sock_get(&osskt, conn->skt)) { - int error; + int error = 0, rv; apr_socklen_t l = sizeof(error); - if (!getsockopt(osskt, SOL_SOCKET, SO_ERROR, (char*)&error, - &l)) { + rv = getsockopt(osskt, SOL_SOCKET, SO_ERROR, (char*)&error, &l); + /* The error is placed in errno on Solaris for SO_ERROR */ + if (rv) + error = errno; + + if (error) { status = APR_FROM_OS_ERROR(error); /* Handle fallback for multi-homed servers. @@ -1310,8 +1303,8 @@ apr_status_t serf__process_connection(se && conn->address->next != NULL && (APR_STATUS_IS_ECONNREFUSED(status) || APR_STATUS_IS_TIMEUP(status) - || APR_STATUS_IS_ENETUNREACH(status))) { - + || APR_STATUS_IS_ENETUNREACH(status) + || APR_STATUS_IS_EHOSTUNREACH(status))) { conn->address = conn->address->next; return reset_connection(conn, 1); } @@ -1323,6 +1316,17 @@ apr_status_t serf__process_connection(se #endif return APR_EGENERAL; } + if ((events & APR_POLLHUP) != 0) { + /* The connection got reset by the server. On Windows this can happen + when all data is read, so just cleanup the connection and open + a new one. + If we haven't had any successful responses on this connection, + then error out as it is likely a server issue. */ + if (conn->completed_responses) { + return reset_connection(conn, 1); + } + return SERF_ERROR_ABORTED_CONNECTION; + } if ((events & APR_POLLOUT) != 0) { if ((status = write_to_connection(conn)) != APR_SUCCESS) return status;