From 37077eed57911a24bfea1bea5607cf8043522e88c9231231c067eb4598ca4ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Fri, 13 Dec 2024 12:02:54 +0100 Subject: [PATCH] Sync from SUSE:SLFO:Main python-pycurl revision 9bdf7b132b6857853a486a4d0c901e1d --- pause-unpause-xfail.patch | 13 --- pycurl-7.45.2.tar.gz | 3 - pycurl-7.45.3.tar.gz | 3 + python-pycurl.changes | 54 ++++++++- python-pycurl.spec | 14 ++- test-bottle-flask.patch | 230 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 290 insertions(+), 27 deletions(-) delete mode 100644 pause-unpause-xfail.patch delete mode 100644 pycurl-7.45.2.tar.gz create mode 100644 pycurl-7.45.3.tar.gz create mode 100644 test-bottle-flask.patch diff --git a/pause-unpause-xfail.patch b/pause-unpause-xfail.patch deleted file mode 100644 index 1bce6df..0000000 --- a/pause-unpause-xfail.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: pycurl-7.45.2/tests/multi_callback_test.py -=================================================================== ---- pycurl-7.45.2.orig/tests/multi_callback_test.py -+++ pycurl-7.45.2/tests/multi_callback_test.py -@@ -77,7 +77,7 @@ class MultiCallbackTest(unittest.TestCas - - # (mid-transfer) easy.pause(PAUSE_ALL) must call SOCKETFUNCTION to remove sockets - # (mid-transfer) easy.pause(PAUSE_CONT) must call TIMERFUNCTION to resume -- @pytest.mark.xfail(sys.platform == 'darwin', reason='https://github.com/pycurl/pycurl/issues/729') -+ @pytest.mark.xfail(sys.platform is not None, reason='https://github.com/pycurl/pycurl/issues/729') - def test_easy_pause_unpause(self): - self.partial_transfer() - self.socket_result = None diff --git a/pycurl-7.45.2.tar.gz b/pycurl-7.45.2.tar.gz deleted file mode 100644 index c05c6ec..0000000 --- a/pycurl-7.45.2.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5730590be0271364a5bddd9e245c9cc0fb710c4cbacbdd95264a3122d23224ca -size 234245 diff --git a/pycurl-7.45.3.tar.gz b/pycurl-7.45.3.tar.gz new file mode 100644 index 0000000..f7fdecc --- /dev/null +++ b/pycurl-7.45.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c2471af9079ad798e1645ec0b0d3d4223db687379d17dd36a70637449f81d6b +size 236470 diff --git a/python-pycurl.changes b/python-pycurl.changes index 4bb967a..a524b67 100644 --- a/python-pycurl.changes +++ b/python-pycurl.changes @@ -1,3 +1,47 @@ +------------------------------------------------------------------- +Fri Oct 4 14:25:56 UTC 2024 - Matej Cepl + +- Switching off test_multi_ tests, they are just too + unrealiable. When running the test cycle in cycle I have never + managed to make it pass ten times without this change. + +------------------------------------------------------------------- +Tue Sep 24 10:47:25 UTC 2024 - Daniel Garcia + +- Add upstream patch test-bottle-flask.patch to use Flask instead of + bottle for tests. + gh#pycurl/pycurl#838 + +------------------------------------------------------------------- +Thu Jun 6 15:17:31 UTC 2024 - Dirk Müller + +- update to 7.45.3: + * Add CURLOPT_REQUEST_TARGET option + * Add missing 2nd parameters to METH_NOARGS functions + * Add CURLOPT_AWS_SIGV4 option (patch by Scott Talbert). + * Add consistent names for newer Curl version constants + * Only run HTTP version 3 option constant test if curl + supported + * Expose COMPILE_SSL_LIB in Python and use for test filtering + * Filter tests based on *compile* libcurl version not runtime + version + * Use print function in callbacks documentation + * Add missing shebang to tests/ext/test-suite.sh + * Officially declare support for Python 3.12 + * Fix curl_multi_info_read flow that loses messages + * Support using environment variables for setup on Windows + * Add support for Schannel SSL backend (patch by Scott Talbert) + * Skip HTTP2 tests based on a curl support check + * Fix fake-curl tests so they work when run out of tree + * xfail test_easy_pause_unpause unconditionally + * Provide generic error strings in pycurl.error objects + * Change URLs to new curl mailing list (patch by Michael C). + * Add missing HTTPS proxy options (patch by Jean Hominal). + * Add support for setting CURLOPT_SSLCERT_BLOB + * Add support for setting rest of CURLOPTTYPE_BLOB fields + * Build wheels on Linux/macOS/Windows (patch by Scott Talbert). +- drop pause-unpause-xfail.patch (upstream) + ------------------------------------------------------------------- Fri Dec 15 01:53:16 UTC 2023 - Steve Kowalik @@ -130,7 +174,7 @@ Wed Apr 8 12:05:25 UTC 2020 - Tomáš Chvátal Tue Mar 3 12:01:13 UTC 2020 - Ondřej Súkup - update to 7.43.0.5 -- refresh python-pycurl-7.43.0-tls-backend.patch +- refresh python-pycurl-7.43.0-tls-backend.patch * added python 3.8 support * officialy ended support for python 2 @@ -579,18 +623,18 @@ Tue May 20 12:13:23 UTC 2014 - toddrme2178@gmail.com ------------------------------------------------------------------- Fri Aug 30 18:07:30 UTC 2013 - crrodriguez@opensuse.org -- remove runtime curl version check and __DATE__ __TIME__ usage +- remove runtime curl version check and __DATE__ __TIME__ usage (pycurl-no-runtime-curlvercheck.patch) ------------------------------------------------------------------- Fri Apr 5 13:16:51 UTC 2013 - idonmez@suse.com -- Add Source URL, see https://en.opensuse.org/SourceUrls +- Add Source URL, see https://en.opensuse.org/SourceUrls ------------------------------------------------------------------- Sat Apr 28 06:42:57 UTC 2012 - highwaystar.ru@gmail.com -- added python3 package +- added python3 package - spec file slighly cleaned (old buildroot macro replaced) ------------------------------------------------------------------- @@ -608,7 +652,7 @@ Tue Sep 20 11:54:25 UTC 2011 - saschpe@suse.de Wed Feb 10 11:45:01 UTC 2010 - jfunk@funktronics.ca - Update to 7.19.0: - * Added CURLFILE, ADDRESS_SCOPE and ISSUERCERT options, + * Added CURLFILE, ADDRESS_SCOPE and ISSUERCERT options, as well as the APPCONNECT_TIME info. * Added PRIMARY_IP info (patch by Yuhui H ). diff --git a/python-pycurl.spec b/python-pycurl.spec index 6e69566..0e79c2c 100644 --- a/python-pycurl.spec +++ b/python-pycurl.spec @@ -1,7 +1,7 @@ # -# spec file +# spec file for package python-pycurl # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # 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.2 +Version: 7.45.3 Release: 0 Summary: PycURL -- cURL library module License: LGPL-2.1-or-later AND MIT @@ -41,8 +41,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-OPENSUSE xfail a test around pause/unpause not behaving -Patch4: pause-unpause-xfail.patch +# PATCH-FIX-UPSTREAM test-bottle-flask.patch gh#pycurl/pycurl#838 +Patch4: test-bottle-flask.patch BuildRequires: %{python_module devel} BuildRequires: %{python_module setuptools} BuildRequires: fdupes @@ -51,7 +51,7 @@ BuildRequires: python-rpm-macros BuildRequires: pkgconfig(libcurl) >= 7.19.0 BuildRequires: pkgconfig(openssl) %if %{with test} -BuildRequires: %{python_module bottle} +BuildRequires: %{python_module Flask} BuildRequires: %{python_module flaky} BuildRequires: %{python_module pytest} %endif @@ -127,6 +127,8 @@ dont_test="or test_getinfo " dont_test+="or test_multi_socket_select " # test_multi_socket_action gh#pycurl/pycurl#729 dont_test+="or test_multi_socket_action " +# just get rid of all test_multi tests +dont_test+="or test_multi_ " # test_request_with_verifypeer for gh#pycurl/pycurl#822 dont_test+="or test_request_with_verifypeer " %pytest_arch -s -k "not ($test_flags $dont_test)" diff --git a/test-bottle-flask.patch b/test-bottle-flask.patch new file mode 100644 index 0000000..9db4add --- /dev/null +++ b/test-bottle-flask.patch @@ -0,0 +1,230 @@ +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 = {} +