==>(B Building on scovillain(B ==>(B Checking for remote environment...(B ==>(B Syncing package to remote host...(B sending incremental file list created directory packages/python-curl-adapter ./ .SRCINFO 876 100% 0.00kB/s 0:00:00 876 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=7/9) .nvchecker.toml 60 100% 58.59kB/s 0:00:00 60 100% 58.59kB/s 0:00:00 (xfr#2, to-chk=6/9) LICENSE 646 100% 630.86kB/s 0:00:00 646 100% 630.86kB/s 0:00:00 (xfr#3, to-chk=5/9) PKGBUILD 1,263 100% 1.20MB/s 0:00:00 1,263 100% 1.20MB/s 0:00:00 (xfr#4, to-chk=4/9) REUSE.toml 437 100% 426.76kB/s 0:00:00 437 100% 426.76kB/s 0:00:00 (xfr#5, to-chk=3/9) python-curl-adapter-1.2.3-1.log 756 100% 738.28kB/s 0:00:00 756 100% 738.28kB/s 0:00:00 (xfr#6, to-chk=2/9) LICENSES/ LICENSES/0BSD.txt -> ../LICENSE sent 2,674 bytes received 195 bytes 1,912.67 bytes/sec total size is 3,501 speedup is 1.22 ==>(B Running pkgctl build --arch riscv64 on remote host...(B ==> WARNING:(B invalid architecture: riscv64(B ==>(B Updating pacman database cache(B [?25l:: Synchronizing package databases... core downloading... extra downloading... multilib downloading... [?25h==>(B Building python-curl-adapter(B  ->(B repo: extra(B  ->(B arch: riscv64(B  ->(B worker: felix-0(B ==>(B Building python-curl-adapter for [extra] (riscv64)(B ]3008;start=826549a3ad744392a4f3688e8c9dd4d9;user=felix;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=7aa8dc8df6944facb1fcda0017f06b49;pid=1533573;comm=sudo;targetuser=root;type=session\Note: in a future version of systemd-nspawn the default set of permitted socket address families will be restricted to AF_INET, AF_INET6 and AF_UNIX. Use --restrict-address-families= to configure the set of permitted socket address families, or set RestrictAddressFamilies= in a .nspawn file. ]3008;start=db52eaf76e5240beb7582bb8ae239880;user=root;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=7aa8dc8df6944facb1fcda0017f06b49;pid=1533617;comm=systemd-nspawn;container=arch-nspawn-1533617;type=container\]11;?\]2;🔵 Container arch-nspawn-1533617 on scovillain.felixc.at\[?25l:: Synchronizing package databases... core downloading... extra downloading... :: Starting full system upgrade... there is nothing to do [?25h[!p]104\[?7h]3008;end=db52eaf76e5240beb7582bb8ae239880\==>(B Building in chroot for [extra] (riscv64)...(B ==>(B Synchronizing chroot copy [/var/lib/archbuild/extra-riscv64/root] -> [felix-0]...(Bdone(B ]3008;start=d07effc45e364639b3274c909b1fafa7;user=root;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=7aa8dc8df6944facb1fcda0017f06b49;pid=1533989;comm=sudo;targetuser=felix;type=session\==>(B Making package: python-curl-adapter 1.2.3-1 (Tue Sep 22 15:52:01 2026)(B ==>(B Retrieving sources...(B  ->(B Cloning curl-adapter git repo...(B Cloning into bare repository '/home/felix/packages/python-curl-adapter/curl-adapter'... remote: Enumerating objects: 384, done. remote: Counting objects: 25% (1/4) remote: Counting objects: 50% (2/4) remote: Counting objects: 75% (3/4) remote: Counting objects: 100% (4/4) remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 33% (1/3) remote: Compressing objects: 66% (2/3) remote: Compressing objects: 100% (3/3) remote: Compressing objects: 100% (3/3), done. Receiving objects: 0% (1/384) Receiving objects: 1% (4/384) Receiving objects: 2% (8/384) Receiving objects: 3% (12/384) Receiving objects: 4% (16/384) Receiving objects: 5% (20/384) Receiving objects: 6% (24/384) Receiving objects: 7% (27/384) Receiving objects: 8% (31/384) Receiving objects: 9% (35/384) Receiving objects: 10% (39/384) Receiving objects: 11% (43/384) Receiving objects: 12% (47/384) Receiving objects: 13% (50/384) Receiving objects: 14% (54/384) Receiving objects: 15% (58/384) Receiving objects: 16% (62/384) Receiving objects: 17% (66/384) Receiving objects: 18% (70/384) Receiving objects: 19% (73/384) Receiving objects: 20% (77/384) Receiving objects: 21% (81/384) Receiving objects: 22% (85/384) Receiving objects: 23% (89/384) Receiving objects: 24% (93/384) Receiving objects: 25% (96/384) Receiving objects: 26% (100/384) Receiving objects: 27% (104/384) Receiving objects: 28% (108/384) Receiving objects: 29% (112/384) Receiving objects: 30% (116/384) Receiving objects: 31% (120/384) Receiving objects: 32% (123/384) Receiving objects: 33% (127/384) Receiving objects: 34% (131/384) Receiving objects: 35% (135/384) Receiving objects: 36% (139/384) Receiving objects: 37% (143/384) Receiving objects: 38% (146/384) Receiving objects: 39% (150/384) Receiving objects: 40% (154/384) Receiving objects: 41% (158/384) Receiving objects: 42% (162/384) Receiving objects: 43% (166/384) Receiving objects: 44% (169/384) Receiving objects: 45% (173/384) Receiving objects: 46% (177/384) Receiving objects: 47% (181/384) Receiving objects: 48% (185/384) Receiving objects: 49% (189/384) Receiving objects: 50% (192/384) Receiving objects: 51% (196/384) Receiving objects: 52% (200/384) Receiving objects: 53% (204/384) Receiving objects: 54% (208/384) Receiving objects: 55% (212/384) Receiving objects: 56% (216/384) Receiving objects: 57% (219/384) Receiving objects: 58% (223/384) Receiving objects: 59% (227/384) Receiving objects: 60% (231/384) Receiving objects: 61% (235/384) Receiving objects: 62% (239/384) Receiving objects: 63% (242/384) Receiving objects: 64% (246/384) Receiving objects: 65% (250/384) Receiving objects: 66% (254/384) Receiving objects: 67% (258/384) Receiving objects: 68% (262/384) Receiving objects: 69% (265/384) Receiving objects: 70% (269/384) Receiving objects: 71% (273/384) Receiving objects: 72% (277/384) Receiving objects: 73% (281/384) Receiving objects: 74% (285/384) Receiving objects: 75% (288/384) Receiving objects: 76% (292/384) Receiving objects: 77% (296/384) Receiving objects: 78% (300/384) Receiving objects: 79% (304/384) Receiving objects: 80% (308/384) Receiving objects: 81% (312/384) Receiving objects: 82% (315/384) Receiving objects: 83% (319/384) Receiving objects: 84% (323/384) Receiving objects: 85% (327/384) remote: Total 384 (delta 1), reused 1 (delta 1), pack-reused 380 (from 1) Receiving objects: 86% (331/384) Receiving objects: 87% (335/384) Receiving objects: 88% (338/384) Receiving objects: 89% (342/384) Receiving objects: 90% (346/384) Receiving objects: 91% (350/384) Receiving objects: 92% (354/384) Receiving objects: 93% (358/384) Receiving objects: 94% (361/384) Receiving objects: 95% (365/384) Receiving objects: 96% (369/384) Receiving objects: 97% (373/384) Receiving objects: 98% (377/384) Receiving objects: 99% (381/384) Receiving objects: 100% (384/384) Receiving objects: 100% (384/384), 103.09 KiB | 343.00 KiB/s, done. Resolving deltas: 0% (0/237) Resolving deltas: 1% (3/237) Resolving deltas: 2% (5/237) Resolving deltas: 3% (8/237) Resolving deltas: 4% (10/237) Resolving deltas: 5% (12/237) Resolving deltas: 6% (15/237) Resolving deltas: 7% (17/237) Resolving deltas: 8% (19/237) Resolving deltas: 9% (22/237) Resolving deltas: 10% (24/237) Resolving deltas: 11% (27/237) Resolving deltas: 12% (29/237) Resolving deltas: 13% (31/237) Resolving deltas: 14% (34/237) Resolving deltas: 15% (36/237) Resolving deltas: 16% (38/237) Resolving deltas: 17% (41/237) Resolving deltas: 18% (43/237) Resolving deltas: 19% (46/237) Resolving deltas: 20% (48/237) Resolving deltas: 21% (50/237) Resolving deltas: 22% (53/237) Resolving deltas: 23% (56/237) Resolving deltas: 24% (58/237) Resolving deltas: 25% (60/237) Resolving deltas: 26% (62/237) Resolving deltas: 27% (64/237) Resolving deltas: 28% (67/237) Resolving deltas: 29% (69/237) Resolving deltas: 30% (72/237) Resolving deltas: 31% (74/237) Resolving deltas: 32% (76/237) Resolving deltas: 33% (79/237) Resolving deltas: 34% (81/237) Resolving deltas: 35% (83/237) Resolving deltas: 36% (86/237) Resolving deltas: 37% (88/237) Resolving deltas: 38% (91/237) Resolving deltas: 39% (93/237) Resolving deltas: 40% (95/237) Resolving deltas: 41% (98/237) Resolving deltas: 42% (100/237) Resolving deltas: 43% (102/237) Resolving deltas: 44% (105/237) Resolving deltas: 45% (107/237) Resolving deltas: 46% (110/237) Resolving deltas: 47% (112/237) Resolving deltas: 48% (114/237) Resolving deltas: 49% (117/237) Resolving deltas: 50% (119/237) Resolving deltas: 51% (121/237) Resolving deltas: 52% (124/237) Resolving deltas: 53% (126/237) Resolving deltas: 54% (128/237) Resolving deltas: 55% (131/237) Resolving deltas: 56% (133/237) Resolving deltas: 57% (137/237) Resolving deltas: 58% (138/237) Resolving deltas: 59% (140/237) Resolving deltas: 60% (143/237) Resolving deltas: 61% (145/237) Resolving deltas: 62% (148/237) Resolving deltas: 63% (150/237) Resolving deltas: 64% (153/237) Resolving deltas: 65% (155/237) Resolving deltas: 66% (157/237) Resolving deltas: 67% (159/237) Resolving deltas: 68% (162/237) Resolving deltas: 69% (164/237) Resolving deltas: 70% (166/237) Resolving deltas: 71% (169/237) Resolving deltas: 72% (171/237) Resolving deltas: 73% (174/237) Resolving deltas: 74% (176/237) Resolving deltas: 75% (178/237) Resolving deltas: 76% (181/237) Resolving deltas: 77% (183/237) Resolving deltas: 78% (185/237) Resolving deltas: 79% (188/237) Resolving deltas: 80% (190/237) Resolving deltas: 81% (192/237) Resolving deltas: 82% (195/237) Resolving deltas: 83% (197/237) Resolving deltas: 84% (200/237) Resolving deltas: 85% (203/237) Resolving deltas: 86% (204/237) Resolving deltas: 87% (207/237) Resolving deltas: 88% (209/237) Resolving deltas: 89% (211/237) Resolving deltas: 90% (214/237) Resolving deltas: 91% (216/237) Resolving deltas: 92% (219/237) Resolving deltas: 93% (221/237) Resolving deltas: 94% (223/237) Resolving deltas: 95% (227/237) Resolving deltas: 96% (228/237) Resolving deltas: 97% (230/237) Resolving deltas: 98% (233/237) Resolving deltas: 99% (235/237) Resolving deltas: 100% (237/237) Resolving deltas: 100% (237/237), done. ==>(B Validating source files with b2sums...(B curl-adapter ... Passed ]3008;end=d07effc45e364639b3274c909b1fafa7\Note: in a future version of systemd-nspawn the default set of permitted socket address families will be restricted to AF_INET, AF_INET6 and AF_UNIX. Use --restrict-address-families= to configure the set of permitted socket address families, or set RestrictAddressFamilies= in a .nspawn file. ]3008;start=c3e7da8b7b564258b1229b35a273b840;user=root;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=7aa8dc8df6944facb1fcda0017f06b49;pid=1534963;comm=systemd-nspawn;container=makechrootpkg-python-curl-adapter.build.1533594;type=container\]11;?\]2;🔵 Container makechrootpkg-python-curl-adapter.build.1533594 on scovillain.felixc.at\]3008;start=4722171d781640a7890da62e12d7af14;user=root;hostname=makechrootpkg-python-curl-adapter.build.1533594;machineid=f7ddc4a20a754cfcac5123f2ba16e0f3;bootid=5b1a957f1180427088611fc032cce6b2;pid=14;comm=sudo;targetuser=builduser;type=session\==>(B Making package: python-curl-adapter 1.2.3-1 (Tue Sep 22 15:52:32 2026)(B ==>(B Checking runtime dependencies...(B ==>(B Installing missing dependencies...(B ]3008;start=a266903b9ab9477597288172bfa66399;user=builduser;hostname=makechrootpkg-python-curl-adapter.build.1533594;machineid=f7ddc4a20a754cfcac5123f2ba16e0f3;bootid=5b1a957f1180427088611fc032cce6b2;pid=887;comm=sudo;targetuser=root;type=session\[?25lresolving dependencies... looking for conflicting packages... Package (35) New Version Net Change Download Size extra/c-ares 1.34.8-1 0.52 MiB extra/curl-impersonate 2.2.2-1 7.80 MiB 2.58 MiB extra/libev 4.33-5.1 0.19 MiB extra/libuv 1.52.1-2 0.62 MiB extra/python-autocommand 2.2.2-9 0.08 MiB extra/python-certifi 2026.07.22-1 0.02 MiB extra/python-cffi 2.1.1-1 1.41 MiB extra/python-charset-normalizer 3.5.1-1 0.63 MiB extra/python-dnspython 1:2.8.0-3 3.99 MiB extra/python-gevent 26.9.0-1 9.53 MiB 1.86 MiB extra/python-greenlet 3.5.6-1 0.47 MiB 0.12 MiB extra/python-idna 3.20-1 0.68 MiB extra/python-jaraco.collections 5.1.0-3 0.11 MiB extra/python-jaraco.context 6.1.2-1 0.06 MiB extra/python-jaraco.functools 4.1.0-3 0.07 MiB extra/python-jaraco.text 4.0.0-4 0.08 MiB extra/python-markdown-it-py 4.2.0-1 0.81 MiB extra/python-mdurl 0.1.2-9 0.06 MiB extra/python-more-itertools 11.1.0-1 0.77 MiB extra/python-packaging 26.3-1 1.58 MiB extra/python-platformdirs 4.11.12-1 0.49 MiB extra/python-pycparser 3.00-1 0.71 MiB extra/python-pygments 2.21.0-1 15.59 MiB extra/python-rich 15.0.0-1 4.49 MiB extra/python-setuptools 1:84.0.0-1 4.92 MiB extra/python-typing_extensions 4.16.0-1 0.53 MiB extra/python-wheel 0.48.0-1 0.34 MiB extra/python-zope-event 6.2-1 0.02 MiB extra/python-zope-interface 8.6-1.1 3.18 MiB core/python-brotli 1.2.0-1 0.88 MiB extra/python-curl_cffi 0.16.3-1 1.48 MiB 0.26 MiB extra/python-eventlet 0.41.0-1 3.06 MiB 0.64 MiB extra/python-pycurl 7.47.0-1 0.54 MiB extra/python-requests 2.34.2-1 0.76 MiB extra/python-urllib3 2.6.3-1 1.44 MiB Total Download Size: 5.46 MiB Total Installed Size: 67.89 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... curl-impersonate-2.2.2-1-riscv64 downloading... python-gevent-26.9.0-1-riscv64 downloading... python-eventlet-0.41.0-1-any downloading... python-curl_cffi-0.16.3-1-riscv64 downloading... python-greenlet-3.5.6-1-riscv64 downloading... checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing python-brotli... installing curl-impersonate... installing python-certifi... installing python-pycparser... installing python-cffi... Optional dependencies for python-cffi python-setuptools: "limited api" version checking in cffi.setuptools_ext [pending] installing python-dnspython... Optional dependencies for python-dnspython python-cryptography: DNSSEC support python-requests-toolbelt: DoH support python-idna: support for updated IDNA 2008 [pending] python-curio: async support python-trio: async support python-sniffio: async support installing python-greenlet... installing python-eventlet... Optional dependencies for python-eventlet python-httplib2: non-blocking HTTP support python-psycopg2: non-blocking PostgreSQL support python-pyopenssl: non-blocking SSL support python-pyzmq: non-blocking ZeroMQ support installing c-ares... installing libev... installing libuv... installing python-more-itertools... installing python-jaraco.functools... installing python-jaraco.context... installing python-autocommand... installing python-jaraco.text... Optional dependencies for python-jaraco.text python-inflect: for show-newlines script installing python-jaraco.collections... installing python-packaging... installing python-platformdirs... installing python-wheel... Optional dependencies for python-wheel python-keyring: for wheel.signatures python-xdg: for wheel.signatures python-setuptools: for legacy bdist_wheel subcommand [pending] installing python-setuptools... installing python-zope-event... installing python-zope-interface... installing python-gevent... installing python-typing_extensions... installing python-mdurl... installing python-markdown-it-py... Optional dependencies for python-markdown-it-py python-mdit_py_plugins: core plugins python-linkify-it-py: linkify extension installing python-pygments... installing python-rich... installing python-curl_cffi... Optional dependencies for python-curl_cffi python-orjson: speed and memory optimized JSON parsing python-markdownify python-lxml-html-clean python-readability-lxml installing python-pycurl... installing python-charset-normalizer... installing python-idna... installing python-urllib3... Optional dependencies for python-urllib3 python-brotli: Brotli support [installed] python-brotlicffi: Brotli support python-h2: HTTP/2 support python-pysocks: SOCKS support installing python-requests... Optional dependencies for python-requests python-chardet: alternative character encoding library python-pysocks: SOCKS proxy support :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate... [?25h]3008;end=a266903b9ab9477597288172bfa66399\==>(B Checking buildtime dependencies...(B ==>(B Installing missing dependencies...(B ]3008;start=88f65b07343542389b92ce662196b0df;user=builduser;hostname=makechrootpkg-python-curl-adapter.build.1533594;machineid=f7ddc4a20a754cfcac5123f2ba16e0f3;bootid=5b1a957f1180427088611fc032cce6b2;pid=1072;comm=sudo;targetuser=root;type=session\[?25lresolving dependencies... looking for conflicting packages... Package (11) New Version Net Change extra/perl-error 0.17030-3 0.04 MiB extra/perl-mailtools 2.22-3 0.10 MiB extra/perl-timedate 2.35-1 0.15 MiB extra/python-iniconfig 2.3.0-1 0.07 MiB extra/python-pluggy 1.6.0-3.1 0.23 MiB extra/python-pyproject-hooks 1.3.3-1 0.11 MiB extra/zlib-ng 2.3.3-1 0.23 MiB extra/git 2.55.0-1 29.92 MiB extra/python-build 1.6.0-1 0.33 MiB extra/python-installer 1.0.1-1 0.21 MiB extra/python-pytest 1:9.1.1-1 4.95 MiB Total Installed Size: 36.34 MiB :: Proceed with installation? [Y/n] checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing perl-error... installing perl-timedate... installing perl-mailtools... installing zlib-ng... installing git... Optional dependencies for git git-zsh-completion: upstream zsh completion tk: gitk and git gui openssh: ssh transport and crypto man: show help with `git command --help` perl-libwww: git svn perl-term-readkey: git svn and interactive.singlekey setting perl-io-socket-ssl: git send-email TLS support perl-authen-sasl: git send-email TLS support perl-cgi: gitweb (web interface) support python: git svn & git p4 [installed] subversion: git svn org.freedesktop.secrets: keyring credential helper libsecret: libsecret credential helper [installed] less: the default pager for git installing python-pyproject-hooks... installing python-build... Optional dependencies for python-build python-pip: to use as the Python package installer (default) python-uv: to use as the Python package installer python-virtualenv: to use virtualenv for build isolation installing python-installer... installing python-iniconfig... installing python-pluggy... installing python-pytest... :: Running post-transaction hooks... (1/4) Creating system user accounts... Creating group 'git' with GID 968. Creating user 'git' (git daemon user) with UID 968 and GID 968. (2/4) Reloading system manager configuration... Skipped: Current root is not booted. (3/4) Arming ConditionNeedsUpdate... (4/4) Checking for old perl modules... [?25h]3008;end=88f65b07343542389b92ce662196b0df\==>(B Retrieving sources...(B ==> WARNING:(B Skipping all source file integrity checks.(B ==>(B Extracting sources...(B  ->(B Creating working copy of curl-adapter git repo...(B Cloning into 'curl-adapter'... done. Switched to a new branch 'makepkg' ==>(B Starting build()...(B * Getting build dependencies for wheel... running egg_info creating curl_adapter.egg-info writing curl_adapter.egg-info/PKG-INFO writing dependency_links to curl_adapter.egg-info/dependency_links.txt writing requirements to curl_adapter.egg-info/requires.txt writing top-level names to curl_adapter.egg-info/top_level.txt writing manifest file 'curl_adapter.egg-info/SOURCES.txt' reading manifest file 'curl_adapter.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no previously-included files found matching '.pytest_cache' warning: no previously-included files found matching '.venv' warning: no previously-included files found matching 'other/*' adding license file 'LICENSE' writing manifest file 'curl_adapter.egg-info/SOURCES.txt' WARNING `project.license` as a TOML table is deprecated !! ******************************************************************************** Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). By 2027-Feb-18, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! * Building wheel... running bdist_wheel running build running build_py creating build/lib/curl_adapter copying curl_adapter/pycurl.py -> build/lib/curl_adapter copying curl_adapter/curl_cffi.py -> build/lib/curl_adapter copying curl_adapter/__init__.py -> build/lib/curl_adapter copying curl_adapter/base_adapter.py -> build/lib/curl_adapter running egg_info writing curl_adapter.egg-info/PKG-INFO writing dependency_links to curl_adapter.egg-info/dependency_links.txt writing requirements to curl_adapter.egg-info/requires.txt writing top-level names to curl_adapter.egg-info/top_level.txt reading manifest file 'curl_adapter.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no previously-included files found matching '.pytest_cache' warning: no previously-included files found matching '.venv' warning: no previously-included files found matching 'other/*' adding license file 'LICENSE' writing manifest file 'curl_adapter.egg-info/SOURCES.txt' copying curl_adapter/py.typed -> build/lib/curl_adapter creating build/lib/curl_adapter/stream copying curl_adapter/stream/__init__.py -> build/lib/curl_adapter/stream copying curl_adapter/stream/response.py -> build/lib/curl_adapter/stream creating build/lib/curl_adapter/stream/handler copying curl_adapter/stream/handler/__init__.py -> build/lib/curl_adapter/stream/handler copying curl_adapter/stream/handler/_thread_env.py -> build/lib/curl_adapter/stream/handler copying curl_adapter/stream/handler/base.py -> build/lib/curl_adapter/stream/handler copying curl_adapter/stream/handler/gevent_handler.py -> build/lib/curl_adapter/stream/handler copying curl_adapter/stream/handler/multi_handler.py -> build/lib/curl_adapter/stream/handler copying curl_adapter/stream/handler/threads_handler.py -> build/lib/curl_adapter/stream/handler creating build/lib/curl_adapter/stream/sockets copying curl_adapter/stream/sockets/__init__.py -> build/lib/curl_adapter/stream/sockets copying curl_adapter/stream/sockets/curl_cffi_socket.py -> build/lib/curl_adapter/stream/sockets copying curl_adapter/stream/sockets/pycurl_socket.py -> build/lib/curl_adapter/stream/sockets installing to build/bdist.linux-riscv64/wheel running install running install_lib creating build/bdist.linux-riscv64/wheel creating build/bdist.linux-riscv64/wheel/curl_adapter copying build/lib/curl_adapter/pycurl.py -> build/bdist.linux-riscv64/wheel/./curl_adapter copying build/lib/curl_adapter/curl_cffi.py -> build/bdist.linux-riscv64/wheel/./curl_adapter copying build/lib/curl_adapter/__init__.py -> build/bdist.linux-riscv64/wheel/./curl_adapter copying build/lib/curl_adapter/base_adapter.py -> build/bdist.linux-riscv64/wheel/./curl_adapter creating build/bdist.linux-riscv64/wheel/curl_adapter/stream creating build/bdist.linux-riscv64/wheel/curl_adapter/stream/sockets copying build/lib/curl_adapter/stream/sockets/curl_cffi_socket.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/sockets copying build/lib/curl_adapter/stream/sockets/__init__.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/sockets copying build/lib/curl_adapter/stream/sockets/pycurl_socket.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/sockets copying build/lib/curl_adapter/stream/__init__.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream creating build/bdist.linux-riscv64/wheel/curl_adapter/stream/handler copying build/lib/curl_adapter/stream/handler/threads_handler.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/handler copying build/lib/curl_adapter/stream/handler/__init__.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/handler copying build/lib/curl_adapter/stream/handler/multi_handler.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/handler copying build/lib/curl_adapter/stream/handler/base.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/handler copying build/lib/curl_adapter/stream/handler/_thread_env.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/handler copying build/lib/curl_adapter/stream/handler/gevent_handler.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream/handler copying build/lib/curl_adapter/stream/response.py -> build/bdist.linux-riscv64/wheel/./curl_adapter/stream copying build/lib/curl_adapter/py.typed -> build/bdist.linux-riscv64/wheel/./curl_adapter running install_egg_info Copying curl_adapter.egg-info to build/bdist.linux-riscv64/wheel/./curl_adapter-1.2.3-py3.14.egg-info running install_scripts creating build/bdist.linux-riscv64/wheel/curl_adapter-1.2.3.dist-info/WHEEL creating '/build/python-curl-adapter/src/curl-adapter/dist/.tmp-p8qxy8hj/curl_adapter-1.2.3-py3-none-any.whl' and adding 'build/bdist.linux-riscv64/wheel' to it adding 'curl_adapter/__init__.py' adding 'curl_adapter/base_adapter.py' adding 'curl_adapter/curl_cffi.py' adding 'curl_adapter/py.typed' adding 'curl_adapter/pycurl.py' adding 'curl_adapter/stream/__init__.py' adding 'curl_adapter/stream/response.py' adding 'curl_adapter/stream/handler/__init__.py' adding 'curl_adapter/stream/handler/_thread_env.py' adding 'curl_adapter/stream/handler/base.py' adding 'curl_adapter/stream/handler/gevent_handler.py' adding 'curl_adapter/stream/handler/multi_handler.py' adding 'curl_adapter/stream/handler/threads_handler.py' adding 'curl_adapter/stream/sockets/__init__.py' adding 'curl_adapter/stream/sockets/curl_cffi_socket.py' adding 'curl_adapter/stream/sockets/pycurl_socket.py' adding 'curl_adapter-1.2.3.dist-info/licenses/LICENSE' adding 'curl_adapter-1.2.3.dist-info/METADATA' adding 'curl_adapter-1.2.3.dist-info/WHEEL' adding 'curl_adapter-1.2.3.dist-info/top_level.txt' adding 'curl_adapter-1.2.3.dist-info/RECORD' removing build/bdist.linux-riscv64/wheel WARNING `project.license` as a TOML table is deprecated !! ******************************************************************************** Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). By 2027-Feb-18, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! WARNING Package 'curl_adapter.stream' is absent from the `packages` configuration. !! ******************************************************************************** ############################ # Package would be ignored # ############################ Python recognizes 'curl_adapter.stream' as an importable package[^1], but it is absent from setuptools' `packages` configuration. This leads to an ambiguous overall configuration. If you want to distribute this package, please make sure that 'curl_adapter.stream' is explicitly added to the `packages` configuration field. Alternatively, you can also rely on setuptools' discovery methods (for example by using `find_namespace_packages(...)`/`find_namespace:` instead of `find_packages(...)`/`find:`). You can read more about "package discovery" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html If you don't want 'curl_adapter.stream' to be distributed and are already explicitly excluding 'curl_adapter.stream' via `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`, you can try to use `exclude_package_data`, or `include-package-data=False` in combination with a more fine grained `package-data` configuration. You can read more about "package data files" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/datafiles.html [^1]: For Python, any directory (with suitable naming) can be imported, even if it does not contain any `.py` files. On the other hand, currently there is no concept of package data directory, all directories are treated like packages. ******************************************************************************** !! WARNING Package 'curl_adapter.stream.handler' is absent from the `packages` configuration. !! ******************************************************************************** ############################ # Package would be ignored # ############################ Python recognizes 'curl_adapter.stream.handler' as an importable package[^1], but it is absent from setuptools' `packages` configuration. This leads to an ambiguous overall configuration. If you want to distribute this package, please make sure that 'curl_adapter.stream.handler' is explicitly added to the `packages` configuration field. Alternatively, you can also rely on setuptools' discovery methods (for example by using `find_namespace_packages(...)`/`find_namespace:` instead of `find_packages(...)`/`find:`). You can read more about "package discovery" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html If you don't want 'curl_adapter.stream.handler' to be distributed and are already explicitly excluding 'curl_adapter.stream.handler' via `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`, you can try to use `exclude_package_data`, or `include-package-data=False` in combination with a more fine grained `package-data` configuration. You can read more about "package data files" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/datafiles.html [^1]: For Python, any directory (with suitable naming) can be imported, even if it does not contain any `.py` files. On the other hand, currently there is no concept of package data directory, all directories are treated like packages. ******************************************************************************** !! WARNING Package 'curl_adapter.stream.sockets' is absent from the `packages` configuration. !! ******************************************************************************** ############################ # Package would be ignored # ############################ Python recognizes 'curl_adapter.stream.sockets' as an importable package[^1], but it is absent from setuptools' `packages` configuration. This leads to an ambiguous overall configuration. If you want to distribute this package, please make sure that 'curl_adapter.stream.sockets' is explicitly added to the `packages` configuration field. Alternatively, you can also rely on setuptools' discovery methods (for example by using `find_namespace_packages(...)`/`find_namespace:` instead of `find_packages(...)`/`find:`). You can read more about "package discovery" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html If you don't want 'curl_adapter.stream.sockets' to be distributed and are already explicitly excluding 'curl_adapter.stream.sockets' via `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`, you can try to use `exclude_package_data`, or `include-package-data=False` in combination with a more fine grained `package-data` configuration. You can read more about "package data files" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/datafiles.html [^1]: For Python, any directory (with suitable naming) can be imported, even if it does not contain any `.py` files. On the other hand, currently there is no concept of package data directory, all directories are treated like packages. ******************************************************************************** !! Successfully built curl_adapter-1.2.3-py3-none-any.whl ==>(B Starting check()...(B ============================= test session starts ============================== platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0 rootdir: /build/python-curl-adapter/src/curl-adapter configfile: pyproject.toml collected 119 items / 16 deselected / 103 selected tests/test_general.py ...F...........F...F.............F.F....F..F....F. [ 48%] .F................F..FF........FF.F.......F.......... [100%] =================================== FAILURES =================================== _______________________ TestFunctions.test_gzip[binded1] _______________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 35 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d2b8a0> def test_gzip(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter(use_curl_content_decoding=True)) s.mount("https://", curl_adapter(use_curl_content_decoding=True)) > r = s.get(f"{test_server}/gzip", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:68: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.SSLError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: SSLError ___________________ TestFunctions.test_gzip_python[binded5] ____________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _perform(self): ''' The initial basic, blocking way to call perform. ''' try: self.curl.setopt(CurlOpt.WRITEFUNCTION, self._write_callback) > self.curl.perform() E pycurl.error: (28, 'Connection timed out after 10005 milliseconds') curl_adapter/stream/handler/base.py:131: error During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d50880> def test_gzip_python(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter(use_curl_content_decoding=False)) s.mount("https://", curl_adapter(use_curl_content_decoding=False)) > r = s.get(f"{test_server}/gzip", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:77: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ConnectTimeout: (28, 'Connection timed out after 10005 milliseconds') curl_adapter/base_adapter.py:660: ConnectTimeout ______________________ TestFunctions.test_brotli[binded1] ______________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 28 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (28) Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d2b8a0> def test_brotli(self, curl_adapter): if curl_adapter is PyCurlAdapter or hasattr(curl_adapter, "binded_adapter") and curl_adapter.binded_adapter is PyCurlAdapter: # pytest.skip("PyCurl because PyCurl doesn't support brotli decoding by itself.") # Supported in newer versions of pycurl, so we don't need to skip this test anymore. pass with requests.Session() as s: s.mount("http://", curl_adapter(use_curl_content_decoding=True)) s.mount("https://", curl_adapter(use_curl_content_decoding=True)) > r = s.get(f"{test_server}/get", headers={ "Accept-Encoding": "br" }, timeout=10) tests/test_general.py:92: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ReadTimeout: Failed to perform, curl: (28) Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ReadTimeout ________________ TestFunctions.test_raw_response[PyCurlAdapter] ________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = curl_stream_handler = request = , url = 'https://httpbingo.org/gzip' method = 'GET', use_curl_content_decoding = False, headers = HTTPHeaderDict({}) header_list = [], status = 0, reason = '', version = preload_content = False, enforce_content_length = True, auto_close = True def __init__( self, curl_stream_handler: CurlStreamHandlerBase, request: requests.PreparedRequest=None, url=None, #URL method=None, #Method use_curl_content_decoding=None, headers: HTTPHeaderDict=None, #Headers header_list: typing.List[bytes]=None, status=0, #HTTP Status Code reason=None, #HTTP Reason version=None, #HTTP Version header preload_content=False, enforce_content_length=True, auto_close=True, ): if curl_stream_handler.error: > raise curl_stream_handler.error E pycurl.error: (28, 'Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds') curl_adapter/stream/response.py:138: error During handling of the above exception, another exception occurred: self = curl_adapter = def test_raw_response(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter(use_curl_content_decoding=True)) s.mount("https://", curl_adapter(use_curl_content_decoding=True)) r = s.get(f"{test_server}/gzip", timeout=10) size1 = r.raw.tell() s.mount("http://", curl_adapter(use_curl_content_decoding=False)) s.mount("https://", curl_adapter(use_curl_content_decoding=False)) > r = s.get(f"{test_server}/gzip", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:123: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ReadTimeout: (28, 'Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds') curl_adapter/base_adapter.py:660: ReadTimeout ___________________ TestFunctions.test_raw_response[binded1] ___________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 35 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d2b8a0> def test_raw_response(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter(use_curl_content_decoding=True)) s.mount("https://", curl_adapter(use_curl_content_decoding=True)) r = s.get(f"{test_server}/gzip", timeout=10) size1 = r.raw.tell() s.mount("http://", curl_adapter(use_curl_content_decoding=False)) s.mount("https://", curl_adapter(use_curl_content_decoding=False)) > r = s.get(f"{test_server}/gzip", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:123: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.SSLError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: SSLError ________________ TestFunctions.test_redirects[CurlCffiAdapter] _________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = curl_stream_handler = request = , url = 'https://httpbingo.org/get' method = 'GET', use_curl_content_decoding = False, headers = HTTPHeaderDict({}) header_list = [], status = 0, reason = '', version = preload_content = False, enforce_content_length = True, auto_close = True def __init__( self, curl_stream_handler: CurlStreamHandlerBase, request: requests.PreparedRequest=None, url=None, #URL method=None, #Method use_curl_content_decoding=None, headers: HTTPHeaderDict=None, #Headers header_list: typing.List[bytes]=None, status=0, #HTTP Status Code reason=None, #HTTP Reason version=None, #HTTP Version header preload_content=False, enforce_content_length=True, auto_close=True, ): if curl_stream_handler.error: > raise curl_stream_handler.error E curl_cffi.curl.CurlError: Failed to perform, curl: (28) Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/stream/response.py:138: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = def test_redirects(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.get(f"{test_server}/absolute-redirect/3", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:805: in send history = [resp for resp in gen] ^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:292: in resolve_redirects resp = self.send( /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ReadTimeout: Failed to perform, curl: (28) Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ReadTimeout ____________________ TestFunctions.test_redirects[binded1] _____________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 28 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (28) Connection timed out after 10008 milliseconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d2b8a0> def test_redirects(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.get(f"{test_server}/absolute-redirect/3", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ConnectTimeout: Failed to perform, curl: (28) Connection timed out after 10008 milliseconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ConnectTimeout ____________ TestFunctions.test_relative_redirects[CurlCffiAdapter] ____________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = curl_stream_handler = request = url = 'https://httpbingo.org/relative-redirect/1', method = 'GET' use_curl_content_decoding = False, headers = HTTPHeaderDict({}) header_list = [], status = 0, reason = '', version = preload_content = False, enforce_content_length = True, auto_close = True def __init__( self, curl_stream_handler: CurlStreamHandlerBase, request: requests.PreparedRequest=None, url=None, #URL method=None, #Method use_curl_content_decoding=None, headers: HTTPHeaderDict=None, #Headers header_list: typing.List[bytes]=None, status=0, #HTTP Status Code reason=None, #HTTP Reason version=None, #HTTP Version header preload_content=False, enforce_content_length=True, auto_close=True, ): if curl_stream_handler.error: > raise curl_stream_handler.error E curl_cffi.curl.CurlError: Failed to perform, curl: (28) Connection timed out after 10012 milliseconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/stream/response.py:138: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = def test_relative_redirects(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.get(f"{test_server}/relative-redirect/3", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:140: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:805: in send history = [resp for resp in gen] ^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:292: in resolve_redirects resp = self.send( /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ConnectTimeout: Failed to perform, curl: (28) Connection timed out after 10012 milliseconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ConnectTimeout ________________ TestFunctions.test_relative_redirects[binded1] ________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 28 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (28) Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d2b8a0> def test_relative_redirects(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.get(f"{test_server}/relative-redirect/3", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:140: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:805: in send history = [resp for resp in gen] ^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:292: in resolve_redirects resp = self.send( /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ReadTimeout: Failed to perform, curl: (28) Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ReadTimeout _____________________ TestFunctions.test_cookies[binded2] ______________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 35 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d28bf0> def test_cookies(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > s.get(f"{test_server}/cookies/set?cookie1=one", allow_redirects=False, timeout=10) tests/test_general.py:161: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.SSLError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: SSLError _____________________ TestFunctions.test_cookies[binded5] ______________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _perform(self): ''' The initial basic, blocking way to call perform. ''' try: self.curl.setopt(CurlOpt.WRITEFUNCTION, self._write_callback) > self.curl.perform() E pycurl.error: (35, 'TLS connect error: error:0A000126:SSL routines::unexpected eof while reading') curl_adapter/stream/handler/base.py:131: error During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d50880> def test_cookies(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) s.get(f"{test_server}/cookies/set?cookie1=one", allow_redirects=False, timeout=10) s.get(f"{test_server}/cookies/set?cookie2=two", allow_redirects=False, timeout=10) > res = s.get(f"{test_server}/cookies/set?cookie3=three", timeout=10) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_general.py:163: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:805: in send history = [resp for resp in gen] ^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:292: in resolve_redirects resp = self.send( /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.SSLError: (35, 'TLS connect error: error:0A000126:SSL routines::unexpected eof while reading') curl_adapter/base_adapter.py:660: SSLError ___________________ TestFunctions.test_post[CurlCffiAdapter] ___________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = curl_stream_handler = request = , url = 'https://httpbingo.org/post' method = 'POST', use_curl_content_decoding = False, headers = HTTPHeaderDict({}) header_list = [], status = 0, reason = '', version = preload_content = False, enforce_content_length = True, auto_close = True def __init__( self, curl_stream_handler: CurlStreamHandlerBase, request: requests.PreparedRequest=None, url=None, #URL method=None, #Method use_curl_content_decoding=None, headers: HTTPHeaderDict=None, #Headers header_list: typing.List[bytes]=None, status=0, #HTTP Status Code reason=None, #HTTP Reason version=None, #HTTP Version header preload_content=False, enforce_content_length=True, auto_close=True, ): if curl_stream_handler.error: > raise curl_stream_handler.error E curl_cffi.curl.CurlError: Failed to perform, curl: (56) Connection closed abruptly. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/stream/response.py:138: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = def test_post(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > res = s.post(f"{test_server}/post", data={ "postkey": "postvalue" }, allow_redirects=False, timeout=10) tests/test_general.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:712: in post return self.request("POST", url, data=data, json=json, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ConnectionError: Failed to perform, curl: (56) Connection closed abruptly. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ConnectionError _________________ TestFunctions.test_curl_info[PyCurlAdapter] __________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = curl_stream_handler = request = , url = 'https://httpbingo.org/post' method = 'POST', use_curl_content_decoding = False, headers = HTTPHeaderDict({}) header_list = [], status = 0, reason = '', version = preload_content = False, enforce_content_length = True, auto_close = True def __init__( self, curl_stream_handler: CurlStreamHandlerBase, request: requests.PreparedRequest=None, url=None, #URL method=None, #Method use_curl_content_decoding=None, headers: HTTPHeaderDict=None, #Headers header_list: typing.List[bytes]=None, status=0, #HTTP Status Code reason=None, #HTTP Reason version=None, #HTTP Version header preload_content=False, enforce_content_length=True, auto_close=True, ): if curl_stream_handler.error: > raise curl_stream_handler.error E pycurl.error: (35, 'TLS connect error: error:0A000126:SSL routines::unexpected eof while reading') curl_adapter/stream/response.py:138: error During handling of the above exception, another exception occurred: self = curl_adapter = def test_curl_info(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.post(f"{test_server}/post", data={ "test": "data" }, timeout=10) tests/test_general.py:196: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:712: in post return self.request("POST", url, data=data, json=json, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.SSLError: (35, 'TLS connect error: error:0A000126:SSL routines::unexpected eof while reading') curl_adapter/base_adapter.py:660: SSLError ____________________ TestFunctions.test_curl_info[binded0] _____________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) > ).start() ^^^^^^^ curl_adapter/base_adapter.py:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/handler/base.py:139: in start self._wait_for_headers() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _wait_for_headers(self): _done = self.initialized.wait(timeout=self.event_timeout) if not _done: > raise self.read_timeout_error E curl_cffi.curl.CurlError: Read timeout. curl_adapter/stream/handler/gevent_handler.py:48: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d2b950> def test_curl_info(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.post(f"{test_server}/post", data={ "test": "data" }, timeout=10) tests/test_general.py:196: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:712: in post return self.request("POST", url, data=data, json=json, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ReadTimeout: Read timeout. curl_adapter/base_adapter.py:660: ReadTimeout ____________________ TestFunctions.test_curl_info[binded2] _____________________ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 35 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d28bf0> def test_curl_info(self, curl_adapter): with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > r = s.post(f"{test_server}/post", data={ "test": "data" }, timeout=10) tests/test_general.py:196: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:712: in post return self.request("POST", url, data=data, json=json, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 10, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.SSLError: Failed to perform, curl: (35) BoringSSL SSL_connect: Connection closed abruptly (SSL_ERROR_SYSCALL; error queue empty) in connection to httpbingo.org:443. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: SSLError _____________________ TestFunctions.test_timeout[binded2] ______________________ self = request = , stream = False, timeout = 2, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) > curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) curl_adapter/base_adapter.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ curl_adapter/stream/response.py:138: in __init__ raise curl_stream_handler.error curl_adapter/stream/handler/base.py:131: in _perform self.curl.perform() /usr/lib/python3.14/site-packages/curl_cffi/curl.py:594: in perform self._check_error(ret, "perform") _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , errcode = 28 args = ('perform',) def _check_error(self, errcode: int, *args: Any) -> None: if errcode == 0: return error = self._get_error(errcode, *args) if error is not None: > raise error E curl_cffi.curl.CurlError: Failed to perform, curl: (28) Connection timed out after 2006 milliseconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. /usr/lib/python3.14/site-packages/curl_cffi/curl.py:320: CurlError During handling of the above exception, another exception occurred: self = curl_adapter = .binded at 0x3f98d28bf0> def test_timeout(self, curl_adapter): with pytest.raises(requests.exceptions.ReadTimeout) as err: with requests.Session() as s: s.mount("http://", curl_adapter()) s.mount("https://", curl_adapter()) > s.get(f"{test_server}/delay/10", timeout=2) tests/test_general.py:210: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/requests/sessions.py:671: in get return self.request("GET", url, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:651: in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/requests/sessions.py:784: in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = , stream = False, timeout = 2, verify = True cert = None, proxies = OrderedDict() def send( self, request: requests.PreparedRequest, stream=False, timeout=None, verify=True, cert=None, proxies=None ): curl = self.reset_curl() self.cert_verify(curl, request.url, verify, cert) url = self.request_url(request, proxies) request_adapter_options = self._get_request_adapter_options(request) self.set_curl_options( curl, request=request, url=url, timeout=timeout, proxies=proxies, request_adapter_options=request_adapter_options ) a = time.time() try: # Save headers when received header_buffer = BytesIO() curl.setopt(CurlOpt.HEADERDATA, header_buffer) # Callbacks for retrieving & saving curl info object curl_info_dict: CurlInfo = {} # Perform curl request with threading, and return body in a 'read' like class type (by simply using Curl.WRITEFUNCTION callback) start_curl_stream = ( self.stream_handler( curl_instance=curl, callback_after_perform=lambda curl: curl_info_dict.update(self.parse_info(curl)), timeout=timeout, debug=self.debug ) ).start() # Headers are already available curl_info_dict.update(self.parse_info(curl, headers_only=True)) if self.debug: print("[DEBUG] Curl Start Elapsed Time: ", time.time() - a) # Headers are available after start, parse them parsed_headers = self.parse_headers(curl, header_buffer) curl_stream_res = CurlStreamResponse( url=url, method=request.method.upper(), request=request, curl_stream_handler=start_curl_stream, use_curl_content_decoding=self.use_curl_content_decoding, **parsed_headers ) return self.build_response(curl, curl_stream_res, parsed_headers, request, wait_for_body=start_curl_stream._wait_for_body, curl_info_dict=curl_info_dict) except OSError as e: raise ConnectionError(e, request=request) except (CurlError, pycurl.error) as e: error_to_throw = self.curl_error_map(e, has_proxy=proxies) > raise error_to_throw(e, request=request) E requests.exceptions.ConnectTimeout: Failed to perform, curl: (28) Connection timed out after 2006 milliseconds. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. curl_adapter/base_adapter.py:660: ConnectTimeout =============================== warnings summary =============================== tests/test_general.py: 447 warnings /build/python-curl-adapter/src/curl-adapter/curl_adapter/base_adapter.py:262: DeprecationWarning: getinfo option is deprecated return curl.getinfo(option_code) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_general.py::TestFunctions::test_gzip[binded1] - requests.ex... FAILED tests/test_general.py::TestFunctions::test_gzip_python[binded5] - requ... FAILED tests/test_general.py::TestFunctions::test_brotli[binded1] - requests.... FAILED tests/test_general.py::TestFunctions::test_raw_response[PyCurlAdapter] FAILED tests/test_general.py::TestFunctions::test_raw_response[binded1] - req... FAILED tests/test_general.py::TestFunctions::test_redirects[CurlCffiAdapter] FAILED tests/test_general.py::TestFunctions::test_redirects[binded1] - reques... FAILED tests/test_general.py::TestFunctions::test_relative_redirects[CurlCffiAdapter] FAILED tests/test_general.py::TestFunctions::test_relative_redirects[binded1] FAILED tests/test_general.py::TestFunctions::test_cookies[binded2] - requests... FAILED tests/test_general.py::TestFunctions::test_cookies[binded5] - requests... FAILED tests/test_general.py::TestFunctions::test_post[CurlCffiAdapter] - req... FAILED tests/test_general.py::TestFunctions::test_curl_info[PyCurlAdapter] - ... FAILED tests/test_general.py::TestFunctions::test_curl_info[binded0] - reques... FAILED tests/test_general.py::TestFunctions::test_curl_info[binded2] - reques... FAILED tests/test_general.py::TestFunctions::test_timeout[binded2] - requests... ==== 16 failed, 87 passed, 16 deselected, 447 warnings in 437.28s (0:07:17) ==== ==> ERROR:(B A failure occurred in check().(B  Aborting...(B ]3008;end=4722171d781640a7890da62e12d7af14\[!p]104\[?7h]3008;end=c3e7da8b7b564258b1229b35a273b840\==> ERROR:(B Build failed, check /var/lib/archbuild/extra-riscv64/felix-0/build(B [?12l[?25h[?12l[?25h]3008;end=826549a3ad744392a4f3688e8c9dd4d9\[?12l[?25hreceiving incremental file list python-curl-adapter-1.2.3-1-riscv64-build.log python-curl-adapter-1.2.3-1-riscv64-check.log sent 62 bytes received 7,928 bytes 3,196.00 bytes/sec total size is 128,428 speedup is 16.07