74 lines
3.1 KiB
Diff
74 lines
3.1 KiB
Diff
|
|
||
|
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;
|