diff --git a/0002-fix-problem-of-scons-build-of-print.patch b/0002-fix-problem-of-scons-build-of-print.patch deleted file mode 100644 index 5f5bf8e..0000000 --- a/0002-fix-problem-of-scons-build-of-print.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 6ce448ad559446c2a6fa98ba642adbbe314207a1 Mon Sep 17 00:00:00 2001 -From: li-miaomiao_zhr -Date: Thu, 4 May 2023 15:33:36 +0800 -Subject: [PATCH] fix problem of scons build of print - ---- - build/check.py | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/build/check.py b/build/check.py -index 2dacb4c..9dea409 100755 ---- a/build/check.py -+++ b/build/check.py -@@ -52,16 +52,16 @@ if __name__ == '__main__': - - # Find test responses and run them one by one - for case in glob.glob(testdir + "/testcases/*.response"): -- print "== Testing %s ==" % (case) -+ print ("== Testing %s ==" % (case)) - try: - subprocess.check_call([SERF_RESPONSE_EXE, case]) - except subprocess.CalledProcessError: -- print "ERROR: test case %s failed" % (case) -+ print ("ERROR: test case %s failed" % (case)) - sys.exit(1) - -- print "== Running the unit tests ==" -+ print ("== Running the unit tests ==") - try: - subprocess.check_call(TEST_ALL_EXE) - except subprocess.CalledProcessError: -- print "ERROR: test(s) failed in test_all" -+ print ("ERROR: test(s) failed in test_all") - sys.exit(1) --- -2.27.0 - diff --git a/backport-libserf-1.3.9-multihome.patch b/backport-libserf-1.3.9-multihome.patch new file mode 100644 index 0000000..cbe7189 --- /dev/null +++ b/backport-libserf-1.3.9-multihome.patch @@ -0,0 +1,133 @@ +commit 9f03432308609644d633ed79aaa17bcf19b6060e +Author: Tomas Korbar +Date: Fri Jan 27 14:01:11 2023 +0100 + + Fix connection to multihome servers + + When libserfs connection is rejected, epoll socket receives EPOLLHUP + and its handling has to be suspended if the connection was never + set up, so we can check another address if the target server + is located on more ip addresses. + +diff --git a/outgoing.c b/outgoing.c +index 5f5f6b5..313b6c9 100644 +--- a/outgoing.c ++++ b/outgoing.c +@@ -153,6 +153,11 @@ apr_status_t serf__conn_update_pollset(serf_connection_t *conn) + + /* Now put it back in with the correct read/write values. */ + desc.reqevents = APR_POLLHUP | APR_POLLERR; ++ ++ if (conn->wait_for_connect) { ++ desc.reqevents |= APR_POLLOUT; ++ } ++ + if (conn->requests && + conn->state != SERF_CONN_INIT) { + /* If there are any outstanding events, then we want to read. */ +@@ -391,6 +396,9 @@ apr_status_t serf__open_connections(serf_context_t *ctx) + if (status != APR_SUCCESS) { + if (!APR_STATUS_IS_EINPROGRESS(status)) + return status; ++ ++ /* Keep track of when we really connect */ ++ conn->wait_for_connect = true; + } + + /* Flag our pollset as dirty now that we have a new socket. */ +@@ -1253,7 +1261,7 @@ apr_status_t serf__process_connection(serf_connection_t *conn, + * the like sitting on the connection, we give the app a chance to read + * it before we trigger a reset condition. + */ +- if ((events & APR_POLLIN) != 0) { ++ if ((events & APR_POLLIN) != 0 && !conn->wait_for_connect) { + if ((status = read_from_connection(conn)) != APR_SUCCESS) + return status; + +@@ -1264,7 +1272,13 @@ apr_status_t serf__process_connection(serf_connection_t *conn, + return APR_SUCCESS; + } + } +- if ((events & APR_POLLHUP) != 0) { ++ /* ++ * Since new connection which is refused also creates HUP event, ++ * we need to suppress its handling until we are sure that connection ++ * was established, so we can eventually handle denial of connection ++ * by trying different server ++ */ ++ if ((events & APR_POLLHUP) != 0 && !conn->wait_for_connect) { + /* 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. +@@ -1292,11 +1306,16 @@ apr_status_t serf__process_connection(serf_connection_t *conn, + { + apr_os_sock_t osskt; + if (!apr_os_sock_get(&osskt, conn->skt)) { +- int error; ++ int error = 0; ++ int 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,7 +1329,8 @@ apr_status_t serf__process_connection(serf_connection_t *conn, + && 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); +@@ -1324,6 +1344,8 @@ apr_status_t serf__process_connection(serf_connection_t *conn, + return APR_EGENERAL; + } + if ((events & APR_POLLOUT) != 0) { ++ if (conn->wait_for_connect) ++ conn->wait_for_connect = false; + if ((status = write_to_connection(conn)) != APR_SUCCESS) + return status; + } +@@ -1358,6 +1380,7 @@ serf_connection_t *serf_connection_create( + conn->baton.u.conn = conn; + conn->hit_eof = 0; + conn->state = SERF_CONN_INIT; ++ conn->wait_for_connect = false; + conn->latency = -1; /* unknown */ + + /* Create a subpool for our connection. */ +diff --git a/serf_private.h b/serf_private.h +index f906379..b2da7df 100644 +--- a/serf_private.h ++++ b/serf_private.h +@@ -21,6 +21,8 @@ + #ifndef _SERF_PRIVATE_H_ + #define _SERF_PRIVATE_H_ + ++#include ++ + /* ### what the hell? why does the APR interface have a "size" ?? + ### the implication is that, if we bust this limit, we'd need to + ### stop, rebuild a pollset, and repopulate it. what suckage. */ +@@ -284,6 +286,10 @@ struct serf_connection_t { + /* Calculated connection latency. Negative value if latency is unknown. */ + apr_interval_time_t latency; + ++ /* Wait for connect: connect() returned APR_EINPROGRESS. ++ Socket not usable yet */ ++ bool wait_for_connect; ++ + /* Needs to read first before we can write again. */ + int stop_writing; + }; + diff --git a/libserf-python3.patch b/libserf-python3.patch deleted file mode 100644 index 8b25520..0000000 --- a/libserf-python3.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff -up serf-1.3.9/SConstruct.python3 serf-1.3.9/SConstruct ---- serf-1.3.9/SConstruct.python3 2018-07-02 17:21:47.331685070 +0200 -+++ serf-1.3.9/SConstruct 2018-07-02 17:27:12.316413515 +0200 -@@ -20,6 +20,8 @@ - # ==================================================================== - # - -+from __future__ import print_function -+ - import sys - import os - import re -@@ -166,7 +168,7 @@ env.Append(BUILDERS = { - match = re.search('SERF_MAJOR_VERSION ([0-9]+).*' - 'SERF_MINOR_VERSION ([0-9]+).*' - 'SERF_PATCH_VERSION ([0-9]+)', -- env.File('serf.h').get_contents(), -+ env.File('serf.h').get_contents().decode('utf-8'), - re.DOTALL) - MAJOR, MINOR, PATCH = [int(x) for x in match.groups()] - env.Append(MAJOR=str(MAJOR)) -@@ -183,7 +185,7 @@ CALLOUT_OKAY = not (env.GetOption('clean - - unknown = opts.UnknownVariables() - if unknown: -- print 'Warning: Used unknown variables:', ', '.join(unknown.keys()) -+ print('Warning: Used unknown variables:', ', '.join(unknown.keys())) - - apr = str(env['APR']) - apu = str(env['APU']) diff --git a/libserf.spec b/libserf.spec index 0cd96d9..91e1f08 100644 --- a/libserf.spec +++ b/libserf.spec @@ -2,20 +2,19 @@ %global scons_pkg python3-scons Name: libserf -Version: 1.3.9 -Release: 18 +Version: 1.3.10 +Release: 1 Summary: High-Performance Asynchronous HTTP Client Library -License: ASL 2.0 +License: Apache-2.0 URL: https://serf.apache.org/ Source0: https://archive.apache.org/dist/serf/serf-%{version}.tar.bz2 BuildRequires: gcc, %{scons_pkg}, pkgconfig, zlib-devel BuildRequires: apr-devel, apr-util-devel, krb5-devel, openssl-devel Patch0: %{name}-norpath.patch -Patch1: %{name}-python3.patch -Patch2: backport-%{name}-1.3.9-errgetfunc.patch -Patch3: 0001-fix-CC-compiler-error.patch -Patch4: 0002-fix-problem-of-scons-build-of-print.patch +Patch1: backport-%{name}-1.3.9-errgetfunc.patch +Patch2: 0001-fix-CC-compiler-error.patch +Patch3: backport-%{name}-1.3.9-multihome.patch %description The serf library is a C-based HTTP client library built upon the Apache Portable Runtime (APR) library. It multiplexes connections, running the @@ -71,6 +70,12 @@ export LD_LIBRARY_PATH=%{buildroot}%{_libdir} %doc README CHANGES design-guide.txt %changelog +* Wed Aug 09 2023 xingwei - 1.3.10-1 +- Type:requirement +- Id:NA +- SUG:NA +- DESC:Update to version 1.3.10 + * Thu May 4 2023 li-miaomiao_zhr - 1.3.9-18 - Type:bugfix - ID:NA diff --git a/serf-1.3.10.tar.bz2 b/serf-1.3.10.tar.bz2 new file mode 100644 index 0000000..2be2bf2 Binary files /dev/null and b/serf-1.3.10.tar.bz2 differ diff --git a/serf-1.3.9.tar.bz2 b/serf-1.3.9.tar.bz2 deleted file mode 100644 index 734f236..0000000 Binary files a/serf-1.3.9.tar.bz2 and /dev/null differ