diff --git a/_service b/_service index 1328eb7..e1f0f3b 100644 --- a/_service +++ b/_service @@ -1,15 +1,15 @@ - + 7.45.3+git https://github.com/pycurl/pycurl.git git main enable - - + + *.tar gz - + diff --git a/handle-change-debug-curl-8.16.0.patch b/handle-change-debug-curl-8.16.0.patch new file mode 100644 index 0000000..14c3da9 --- /dev/null +++ b/handle-change-debug-curl-8.16.0.patch @@ -0,0 +1,28 @@ +From eb7f52eeef85feb6c117678d52803050bbdd7bc8 Mon Sep 17 00:00:00 2001 +From: Carlos Henrique Lima Melara +Date: Thu, 28 Aug 2025 20:37:33 -0300 +Subject: [PATCH] tests: handle change in debug output in curl 8.16.0 + +Debug message has changed and so the assert in the test is failing. +Handle this by checking the version to pick the expected string to +compare in the test. +--- + tests/debug_test.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +Index: pycurl-7.45.6/tests/debug_test.py +=================================================================== +--- pycurl-7.45.6.orig/tests/debug_test.py ++++ pycurl-7.45.6/tests/debug_test.py +@@ -34,8 +34,10 @@ class DebugTest(unittest.TestCase): + self.check(0, util.b('Trying')) + if util.pycurl_version_less_than(7, 24): + self.check(0, util.b('connected')) +- else: ++ elif util.pycurl_version_less_than(8, 16): + self.check(0, util.b('Connected to %s' % localhost)) ++ else: ++ self.check(0, util.b('Established connection to %s' % localhost)) + self.check(0, util.b('port 8380')) + # request + self.check(2, util.b('GET /success HTTP/1.1')) diff --git a/pycurl-7.45.3.tar.gz b/pycurl-7.45.3.tar.gz deleted file mode 100644 index f7fdecc..0000000 --- a/pycurl-7.45.3.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c2471af9079ad798e1645ec0b0d3d4223db687379d17dd36a70637449f81d6b -size 236470 diff --git a/pycurl-7.45.6.tar.gz b/pycurl-7.45.6.tar.gz new file mode 100644 index 0000000..e45d936 --- /dev/null +++ b/pycurl-7.45.6.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b73e66b22719ea48ac08a93fc88e57ef36d46d03cb09d972063c9aa86bb74e6 +size 239470 diff --git a/python-pycurl.changes b/python-pycurl.changes index 0516d33..d79821f 100644 --- a/python-pycurl.changes +++ b/python-pycurl.changes @@ -1,3 +1,36 @@ +------------------------------------------------------------------- +Fri Sep 12 06:19:06 UTC 2025 - Daniel Garcia + +- Add patch handle-change-debug-curl-8.16.0.patch (bsc#1249448, gh#pycurl/pycurl@eb7f52eeef85) +- Drop patch test-bottle-flask.patch, not needed anymore +- Update to 7.45.6: + * Re-enable building Linux wheels with CA bundle autodetection +- 7.45.5 + * Enable GSS-API and brotli support in wheels (patch by Scott Talbert). + * Add support for calling getinfo with CURLOPT_*_T arguments + (patch by Scott Talbert) + * Change wheels to build using shared libraries (vice static libraries) + (patch by Scott Talbert) + * Build wheels with curl 8.12.1 (mainly for security fixes) +- 7.45.4 + * Add support for CURLOPT_HAPROXY_CLIENT_IP (patch by Scott Talbert). + * Port tests from bottle to flask (patch by Miro Hrončok). + * Add constant for CURL_HTTP_VERSION_3ONLY (patch by Pavel Horáček). + * Add EFFECTIVE_METHOD info option (patch by Pavel Horáček). + * Don't use `-flat_namespace` on macOS (patch by Michael Cho). + * Add some missing GIL checks to callback functions + (patch by Scott Talbert). + * Fix assorted bugs in pycurl tests, including a segfault + (patch by Scott Talbert). All tests should now pass on Linux and + macOS. + * Fix minor bug in examples/multi-socket_action-select.py + (patch by Oleg Broytman). + * Build all wheels using the latest version of libcurl and its + dependencies (patch by Scott Talbert). All wheels should now have + openssl, HTTP2, and SSH support. + * Implement Certificate Authority path autodetection when building + Linux wheels (patch by Scott Talbert). + ------------------------------------------------------------------- Mon Dec 9 09:38:48 UTC 2024 - Matej Cepl diff --git a/python-pycurl.spec b/python-pycurl.spec index 56cbb1e..a38ac76 100644 --- a/python-pycurl.spec +++ b/python-pycurl.spec @@ -1,7 +1,7 @@ # # spec file for package python-pycurl # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -27,7 +27,7 @@ %endif %{?sle15_python_module_pythons} Name: python-pycurl%{psuffix} -Version: 7.45.3 +Version: 7.45.6 %global upversion %{version} Release: 0 Summary: PycURL -- cURL library module @@ -43,8 +43,8 @@ Patch2: disable_randomly_failing_tests.patch # PATCH-FIX-OPENSUSE make-leap15-compat.patch mcepl@suse.com # Make tests passing with Leap 15.2 Patch3: make-leap15-compat.patch -# PATCH-FIX-UPSTREAM test-bottle-flask.patch gh#pycurl/pycurl#838 -Patch4: test-bottle-flask.patch +# PATCH-FIX-UPSTREAM handle-change-debug-curl-8.16.0.patch gh#pycurl/pycurl@eb7f52eeef85 +Patch4: handle-change-debug-curl-8.16.0.patch BuildRequires: %{python_module devel} BuildRequires: %{python_module pip} BuildRequires: %{python_module setuptools} diff --git a/test-bottle-flask.patch b/test-bottle-flask.patch deleted file mode 100644 index 9db4add..0000000 --- a/test-bottle-flask.patch +++ /dev/null @@ -1,230 +0,0 @@ -Index: pycurl-7.45.3/README.rst -=================================================================== ---- pycurl-7.45.3.orig/README.rst -+++ pycurl-7.45.3/README.rst -@@ -89,7 +89,7 @@ PycURL comes with an automated test suit - - make test - --The suite depends on packages `pytest`_ and `bottle`_, as well as `vsftpd`_. -+The suite depends on packages `pytest`_ and `flask`_, as well as `vsftpd`_. - - Some tests use vsftpd configured to accept anonymous uploads. These tests - are not run by default. As configured, vsftpd will allow reads and writes to -@@ -103,7 +103,7 @@ vsftpd tests you must explicitly set PYC - export PYCURL_VSFTPD_PATH=/usr/local/libexec/vsftpd - - .. _pytest: https://pytest.org/ --.. _bottle: http://bottlepy.org/ -+.. _flask: https://flask.palletsprojects.com/ - .. _vsftpd: http://vsftpd.beasts.org/ - - -Index: pycurl-7.45.3/requirements-dev.txt -=================================================================== ---- pycurl-7.45.3.orig/requirements-dev.txt -+++ pycurl-7.45.3/requirements-dev.txt -@@ -1,7 +1,5 @@ --# bottle 0.12.17 changed behavior --# https://github.com/pycurl/pycurl/issues/573 --bottle - flaky -+flask - pyflakes - pytest>=5 - sphinx -Index: pycurl-7.45.3/tests/app.py -=================================================================== ---- pycurl-7.45.3.orig/tests/app.py -+++ pycurl-7.45.3/tests/app.py -@@ -2,7 +2,7 @@ - # vi:ts=4:et - - import time as _time, sys --import bottle -+import flask - try: - import json - except ImportError: -@@ -10,7 +10,7 @@ except ImportError: - - py3 = sys.version_info[0] == 3 - --app = bottle.Bottle() -+app = flask.Flask(__name__) - app.debug = True - - @app.route('/success') -@@ -24,62 +24,47 @@ def short_wait(): - - @app.route('/status/403') - def forbidden(): -- return bottle.HTTPResponse('forbidden', 403) -+ return flask.Response('forbidden', 403) - - @app.route('/status/404') - def not_found(): -- return bottle.HTTPResponse('not found', 404) -+ return flask.Response('not found', 404) - --@app.route('/postfields', method='get') --@app.route('/postfields', method='post') -+@app.route('/postfields', methods=['GET', 'POST']) - def postfields(): -- return json.dumps(dict(bottle.request.forms)) -+ return json.dumps(dict(flask.request.form)) - --@app.route('/raw_utf8', method='post') -+@app.route('/raw_utf8', methods=['POST']) - def raw_utf8(): -- data = bottle.request.body.getvalue().decode('utf8') -+ data = flask.request.data.decode('utf8') - return json.dumps(data) - --# XXX file is not a bottle FileUpload instance, but FieldStorage? - def xconvert_file(key, file): - return { - 'key': key, - 'name': file.name, -- 'raw_filename': file.raw_filename, -+ 'filename': file.filename, - 'headers': file.headers, - 'content_type': file.content_type, - 'content_length': file.content_length, - 'data': file.read(), - } - --if hasattr(bottle, 'FileUpload'): -- # bottle 0.12 -- def convert_file(key, file): -- return { -- 'name': file.name, -- # file.filename lowercases the file name -- # https://github.com/defnull/bottle/issues/582 -- # raw_filenames is a string on python 3 -- 'filename': file.raw_filename, -- 'data': file.file.read().decode(), -- } --else: -- # bottle 0.11 -- def convert_file(key, file): -- return { -- 'name': file.name, -- 'filename': file.filename, -- 'data': file.file.read().decode(), -- } -+def convert_file(key, file): -+ return { -+ 'name': file.name, -+ 'filename': file.filename, -+ 'data': file.read().decode(), -+ } - --@app.route('/files', method='post') -+@app.route('/files', methods=['POST']) - def files(): -- files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files] -+ files = [convert_file(key, flask.request.files[key]) for key in flask.request.files] - return json.dumps(files) - - @app.route('/header') - def header(): -- return bottle.request.headers.get(bottle.request.query['h'], '') -+ return flask.request.headers.get(flask.request.args['h'], '') - - # This is a hacky endpoint to test non-ascii text being given to libcurl - # via headers. -@@ -89,7 +74,7 @@ def header(): - # Thanks to bdarnell for the idea: https://github.com/pycurl/pycurl/issues/124 - @app.route('/header_utf8') - def header_utf8(): -- header_value = bottle.request.headers.get(bottle.request.query['h'], '' if py3 else b'') -+ header_value = flask.request.headers.get(flask.request.args['h'], '' if py3 else b'') - if py3: - # header_value is a string, headers are decoded in latin1 - header_value = header_value.encode('latin1').decode('utf8') -@@ -98,13 +83,9 @@ def header_utf8(): - header_value = header_value.decode('utf8') - return header_value - --@app.route('/param_utf8_hack', method='post') -+@app.route('/param_utf8_hack', methods=['POST']) - def param_utf8_hack(): -- param = bottle.request.forms['p'] -- if py3: -- # python 3 decodes bytes as latin1 perhaps? -- # apply the latin1-utf8 hack -- param = param.encode('latin').decode('utf8') -+ param = flask.request.form['p'] - return param - - def pause_writer(interval): -@@ -127,19 +108,25 @@ def utf8_body(): - - @app.route('/invalid_utf8_body') - def invalid_utf8_body(): -- # bottle encodes the body -- raise bottle.HTTPResponse(b'\xb3\xd2\xda\xcd\xd7', 200) -+ return flask.Response(b'\xb3\xd2\xda\xcd\xd7', 200) - - @app.route('/set_cookie_invalid_utf8') - def set_cookie_invalid_utf8(): -- bottle.response.set_header('Set-Cookie', '\xb3\xd2\xda\xcd\xd7=%96%A6g%9Ay%B0%A5g%A7tm%7C%95%9A') -- return 'cookie set' -+ response = flask.Response('cookie set') -+ # WARNING: The original bottle test passed '\xb3\xd2\xda\xcd\xd7...' as string -+ # Presumably bottle encoded that as utf-8 in the response. -+ # Flask on the other hand encodes such strings as latin-1 (chars in == bytes out). -+ # In order to make the test pass I replicate the original bottle behavior by utf-8->latin1 roundtrip. -+ response.headers['Set-Cookie'] = '\xb3\xd2\xda\xcd\xd7=%96%A6g%9Ay%B0%A5g%A7tm%7C%95%9A'.encode('utf-8').decode('latin-1') -+ return response - - @app.route('/content_type_invalid_utf8') - def content_type_invalid_utf8(): -- bottle.response.set_header('Content-Type', '\xb3\xd2\xda\xcd\xd7') -- return 'content type set' -+ response = flask.Response('content type set') -+ # See the WARNING in set_cookie_invalid_utf8 -+ response.headers['Content-Type'] = '\xb3\xd2\xda\xcd\xd7'.encode('utf-8').decode('latin-1') -+ return response - - @app.route('/status_invalid_utf8') - def status_invalid_utf8(): -- raise bottle.HTTPResponse('status set', '555 \xb3\xd2\xda\xcd\xd7') -+ raise flask.Response('status set', b'555 \xb3\xd2\xda\xcd\xd7') -Index: pycurl-7.45.3/tests/runwsgi.py -=================================================================== ---- pycurl-7.45.3.orig/tests/runwsgi.py -+++ pycurl-7.45.3/tests/runwsgi.py -@@ -1,6 +1,5 @@ - # Run a WSGI application in a daemon thread - --import bottle - import threading - import os.path - -@@ -8,7 +7,14 @@ from . import util - - global_stop = False - --class Server(bottle.WSGIRefServer): -+class Server: -+ quiet = False -+ -+ def __init__(self, host, port, **options): -+ self.options = options -+ self.host = host -+ self.port = int(port) -+ - def run(self, handler): # pragma: no cover - self.srv = self.make_server(handler) - self.serve() -@@ -66,7 +72,7 @@ class ServerThread(threading.Thread): - self.server = server(host='127.0.0.1', port=self.port, **self.server_kwargs) - - def run(self): -- bottle.run(self.app, server=self.server, quiet=True) -+ self.server.run(self.app) - - started_servers = {} -