Skip to content

Test static path traversal on Windows#12068

Draft
Dreamsorcerer wants to merge 5 commits intomasterfrom
Dreamsorcerer-patch-6
Draft

Test static path traversal on Windows#12068
Dreamsorcerer wants to merge 5 commits intomasterfrom
Dreamsorcerer-patch-6

Conversation

@Dreamsorcerer
Copy link
Member

No description provided.

@Dreamsorcerer Dreamsorcerer added bot:chronographer:skip This PR does not need to include a change note backport-3.13 Trigger automatic backporting to the 3.13 release branch by Patchback robot backport-3.14 Trigger automatic backporting to the 3.14 release branch by Patchback robot labels Feb 14, 2026
@codecov
Copy link

codecov bot commented Feb 14, 2026

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
4338 1 4337 49
View the full list of 1 ❄️ flaky test(s)
tests.test_proxy_functional::test_uvloop_secure_https_proxy

Flake rate in main: 3.45% (Passed 28 times, Failed 1 times)

Stack Traces | 1.03s run time
self = <aiohttp.connector.TCPConnector object at 0x105c07890>
underlying_transport = <uvloop.loop._SSLProtocolTransport object at 0x1056ecc40>
req = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
timeout = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
client_error = <class 'aiohttp.client_exceptions.ClientConnectorError'>

    #x1B[0m#x1B[94masync#x1B[39;49;00m #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92m_start_tls_connection#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        underlying_transport: asyncio.Transport,#x1B[90m#x1B[39;49;00m
        req: ClientRequest,#x1B[90m#x1B[39;49;00m
        timeout: #x1B[33m"#x1B[39;49;00m#x1B[33mClientTimeout#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        client_error: #x1B[96mtype#x1B[39;49;00m[#x1B[96mException#x1B[39;49;00m] = ClientConnectorError,#x1B[90m#x1B[39;49;00m
    ) -> #x1B[96mtuple#x1B[39;49;00m[asyncio.BaseTransport, ResponseHandler]:#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Wrap the raw TCP transport with TLS."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        tls_proto = #x1B[96mself#x1B[39;49;00m._factory()  #x1B[90m# Create a brand new proto for TLS#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        sslcontext = #x1B[96mself#x1B[39;49;00m._get_ssl_context(req)#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m TYPE_CHECKING:#x1B[90m#x1B[39;49;00m
            #x1B[90m# _start_tls_connection is unreachable in the current code path#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[90m# if sslcontext is None.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94massert#x1B[39;49;00m sslcontext #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94masync#x1B[39;49;00m #x1B[94mwith#x1B[39;49;00m ceil_timeout(#x1B[90m#x1B[39;49;00m
                timeout.sock_connect, ceil_threshold=timeout.ceil_threshold#x1B[90m#x1B[39;49;00m
            ):#x1B[90m#x1B[39;49;00m
                #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    #x1B[90m# ssl_shutdown_timeout is only available in Python 3.11+#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[94mif#x1B[39;49;00m sys.version_info >= (#x1B[94m3#x1B[39;49;00m, #x1B[94m11#x1B[39;49;00m) #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._ssl_shutdown_timeout:#x1B[90m#x1B[39;49;00m
                        tls_transport = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._loop.start_tls(#x1B[90m#x1B[39;49;00m
                            underlying_transport,#x1B[90m#x1B[39;49;00m
                            tls_proto,#x1B[90m#x1B[39;49;00m
                            sslcontext,#x1B[90m#x1B[39;49;00m
                            server_hostname=req.server_hostname #x1B[95mor#x1B[39;49;00m req.url.raw_host,#x1B[90m#x1B[39;49;00m
                            ssl_handshake_timeout=timeout.total,#x1B[90m#x1B[39;49;00m
                            ssl_shutdown_timeout=#x1B[96mself#x1B[39;49;00m._ssl_shutdown_timeout,#x1B[90m#x1B[39;49;00m
                        )#x1B[90m#x1B[39;49;00m
                    #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>                       tls_transport = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._loop.start_tls(#x1B[90m#x1B[39;49;00m
                            underlying_transport,#x1B[90m#x1B[39;49;00m
                            tls_proto,#x1B[90m#x1B[39;49;00m
                            sslcontext,#x1B[90m#x1B[39;49;00m
                            server_hostname=req.server_hostname #x1B[95mor#x1B[39;49;00m req.url.raw_host,#x1B[90m#x1B[39;49;00m
                            ssl_handshake_timeout=timeout.total,#x1B[90m#x1B[39;49;00m
                        )#x1B[90m#x1B[39;49;00m

client_error = <class 'aiohttp.client_exceptions.ClientConnectorError'>
req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
self       = <aiohttp.connector.TCPConnector object at 0x105c07890>
sslcontext = <ssl.SSLContext object at 0x106dc02d0>
timeout    = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
tls_proto  = <aiohttp.client_proto.ResponseHandler object at 0x107404b90>
underlying_transport = <uvloop.loop._SSLProtocolTransport object at 0x1056ecc40>

#x1B[1m#x1B[31maiohttp/connector.py#x1B[0m:1331: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31muvloop/loop.pyx#x1B[0m:1639: in start_tls
    #x1B[0m#x1B[94mraise#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31muvloop/loop.pyx#x1B[0m:1632: in uvloop.loop.Loop.start_tls
    #x1B[0m#x1B[94mawait#x1B[39;49;00m waiter#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31muvloop/sslproto.pyx#x1B[0m:517: in uvloop.loop.SSLProtocol._on_handshake_complete
    #x1B[0m#x1B[94mraise#x1B[39;49;00m handshake_exc#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31muvloop/sslproto.pyx#x1B[0m:499: in uvloop.loop.SSLProtocol._do_handshake
    #x1B[0m#x1B[96mself#x1B[39;49;00m._sslobj.do_handshake()#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLObject object at 0x10544c590>

    #x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mdo_handshake#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Start the SSL/TLS handshake."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>       #x1B[96mself#x1B[39;49;00m._sslobj.do_handshake()#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE       ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1032)#x1B[0m

self       = <ssl.SSLObject object at 0x10544c590>

#x1B[1m#x1B[.../Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/ssl.py#x1B[0m:951: SSLCertVerificationError

#x1B[33mThe above exception was the direct cause of the following exception:#x1B[0m

client_ssl_ctx = <ssl.SSLContext object at 0x106dc02d0>
secure_proxy_url = URL('https://127.0.0.1:50296')
uvloop_loop = <uvloop.Loop running=False closed=False debug=False>

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.skipif(#x1B[90m#x1B[39;49;00m
        platform.system() == #x1B[33m"#x1B[39;49;00m#x1B[33mWindows#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m sys.implementation.name != #x1B[33m"#x1B[39;49;00m#x1B[33mcpython#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        reason=#x1B[33m"#x1B[39;49;00m#x1B[33muvloop is not supported on Windows and non-CPython implementations#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.filterwarnings(#x1B[33mr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mignore:.*ssl.OP_NO_SSL*#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
    #x1B[90m# Filter out the warning from#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m# https://github.com/abhinavsingh/proxy.py.../proxy/common/utils.py#L226#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m# otherwise this test will fail because the proxy will die with an error.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94masync#x1B[39;49;00m #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_uvloop_secure_https_proxy#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        client_ssl_ctx: ssl.SSLContext,#x1B[90m#x1B[39;49;00m
        secure_proxy_url: URL,#x1B[90m#x1B[39;49;00m
        uvloop_loop: asyncio.AbstractEventLoop,#x1B[90m#x1B[39;49;00m
    ) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Ensure HTTPS sites are accessible through a secure proxy without warning when using uvloop."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        conn = aiohttp.TCPConnector(force_close=#x1B[94mTrue#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
        sess = aiohttp.ClientSession(connector=conn)#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            url = URL(#x1B[33m"#x1B[39;49;00m#x1B[33mhttps://example.com#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>           #x1B[94masync#x1B[39;49;00m #x1B[94mwith#x1B[39;49;00m sess.get(#x1B[90m#x1B[39;49;00m
                url, proxy=secure_proxy_url, ssl=client_ssl_ctx#x1B[90m#x1B[39;49;00m
            ) #x1B[94mas#x1B[39;49;00m response:#x1B[90m#x1B[39;49;00m

client_ssl_ctx = <ssl.SSLContext object at 0x106dc02d0>
conn       = <aiohttp.connector.TCPConnector object at 0x105c07890>
secure_proxy_url = URL('https://127.0.0.1:50296')
sess       = <aiohttp.client.ClientSession object at 0x105ae9f10>
url        = URL('https://example.com')
uvloop_loop = <uvloop.Loop running=False closed=False debug=False>

#x1B[1m#x1B[31mtests/test_proxy_functional.py#x1B[0m:256: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31maiohttp/client.py#x1B[0m:1508: in __aenter__
    #x1B[0m#x1B[96mself#x1B[39;49;00m._resp: _RetType_co = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._coro#x1B[90m#x1B[39;49;00m
                              ^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
        self       = <aiohttp.client._BaseRequestContextManager object at 0x10606c130>
#x1B[1m#x1B[31maiohttp/client.py#x1B[0m:748: in _request
    #x1B[0mresp = #x1B[94mawait#x1B[39;49;00m handler(req)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
        _connect_and_send_request = <function ClientSession._request.<locals>._connect_and_send_request at 0x107456340>
        all_cookies = <BaseCookie: >
        allow_redirects = True
        auth       = None
        auth_from_url = None
        auto_decompress = True
        chunked    = None
        compress   = False
        cookies    = None
        data       = None
        effective_middlewares = ()
        expect100  = False
        handle     = None
        handler    = <function ClientSession._request.<locals>._connect_and_send_request at 0x107456340>
        headers    = <CIMultiDict()>
        history    = []
        json       = None
        max_field_size = 8190
        max_headers = 128
        max_line_size = 8190
        max_redirects = 10
        method     = 'GET'
        middlewares = None
        params     = {}
        proxy      = URL('https://127.0.0.1:50296')
        proxy_     = URL('https://127.0.0.1:50296')
        proxy_auth = None
        proxy_headers = <CIMultiDict()>
        raise_for_status = None
        read_bufsize = 65536
        read_until_eof = True
        real_timeout = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
        redirects  = 0
        req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
        retry_persistent_connection = True
        self       = <aiohttp.client.ClientSession object at 0x105ae9f10>
        server_hostname = None
        skip_auto_headers = None
        skip_headers = None
        ssl        = <ssl.SSLContext object at 0x106dc02d0>
        str_or_url = URL('https://example.com')
        timeout    = <_SENTINEL.sentinel: 1>
        timer      = <aiohttp.helpers.TimerContext object at 0x1056ef700>
        tm         = <aiohttp.helpers.TimeoutHandle object at 0x10571d780>
        trace_request_ctx = None
        traces     = []
        url        = URL('https://example.com')
        version    = HttpVersion(major=1, minor=1)
#x1B[1m#x1B[31maiohttp/client.py#x1B[0m:702: in _connect_and_send_request
    #x1B[0mconn = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._connector.connect(#x1B[90m#x1B[39;49;00m
        auto_decompress = True
        max_field_size = 8190
        max_headers = 128
        max_line_size = 8190
        read_bufsize = 65536
        read_until_eof = True
        real_timeout = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
        req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
        self       = <aiohttp.client.ClientSession object at 0x105ae9f10>
        timer      = <aiohttp.helpers.TimerContext object at 0x1056ef700>
        traces     = []
#x1B[1m#x1B[31maiohttp/connector.py#x1B[0m:611: in connect
    #x1B[0mproto = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._create_connection(req, traces, timeout)#x1B[90m#x1B[39;49;00m
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
        conn       = None
        key        = ConnectionKey(host='example.com', port=443, is_ssl=True, ssl=<ssl.SSLContext object at 0x106dc02d0>, proxy=URL('https://127.0.0.1:50296'), proxy_auth=None, proxy_headers_hash=None)
        placeholder = <aiohttp.connector._TransportPlaceholder object at 0x105d4b910>
        req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
        self       = <aiohttp.connector.TCPConnector object at 0x105c07890>
        timeout    = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
        traces     = []
#x1B[1m#x1B[31maiohttp/connector.py#x1B[0m:1171: in _create_connection
    #x1B[0m_, proto = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._create_proxy_connection(req, traces, timeout)#x1B[90m#x1B[39;49;00m
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
        req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
        self       = <aiohttp.connector.TCPConnector object at 0x105c07890>
        timeout    = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
        traces     = []
#x1B[1m#x1B[31maiohttp/connector.py#x1B[0m:1547: in _create_proxy_connection
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._start_tls_connection(#x1B[90m#x1B[39;49;00m
        conn       = Connection<ConnectionKey(host='example.com', port=443, is_ssl=True, ssl=<ssl.SSLContext object at 0x106dc02d0>, proxy=None, proxy_auth=None, proxy_headers_hash=None)>
        key        = ConnectionKey(host='example.com', port=443, is_ssl=True, ssl=<ssl.SSLContext object at 0x106dc02d0>, proxy=None, proxy_auth=None, proxy_headers_hash=None)
        proto      = <aiohttp.client_proto.ResponseHandler object at 0x107404350>
        protocol   = <aiohttp.client_proto.ResponseHandler object at 0x107404350>
        proxy_req  = <aiohttp.client_reqrep.ClientRequestBase object at 0x10544cd10>
        proxy_resp = <ClientResponse(https://127.0.0.1:50296) [200 Connection established]>
<CIMultiDictProxy()>

        req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
        resp       = <ClientResponse(https://127.0.0.1:50296) [200 Connection established]>
<CIMultiDictProxy()>

        self       = <aiohttp.connector.TCPConnector object at 0x105c07890>
        timeout    = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
        traces     = []
        transport  = <uvloop.loop._SSLProtocolTransport object at 0x1056ecc40>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <aiohttp.connector.TCPConnector object at 0x105c07890>
underlying_transport = <uvloop.loop._SSLProtocolTransport object at 0x1056ecc40>
req = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
timeout = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
client_error = <class 'aiohttp.client_exceptions.ClientConnectorError'>

    #x1B[0m#x1B[94masync#x1B[39;49;00m #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92m_start_tls_connection#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        underlying_transport: asyncio.Transport,#x1B[90m#x1B[39;49;00m
        req: ClientRequest,#x1B[90m#x1B[39;49;00m
        timeout: #x1B[33m"#x1B[39;49;00m#x1B[33mClientTimeout#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        client_error: #x1B[96mtype#x1B[39;49;00m[#x1B[96mException#x1B[39;49;00m] = ClientConnectorError,#x1B[90m#x1B[39;49;00m
    ) -> #x1B[96mtuple#x1B[39;49;00m[asyncio.BaseTransport, ResponseHandler]:#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Wrap the raw TCP transport with TLS."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        tls_proto = #x1B[96mself#x1B[39;49;00m._factory()  #x1B[90m# Create a brand new proto for TLS#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        sslcontext = #x1B[96mself#x1B[39;49;00m._get_ssl_context(req)#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m TYPE_CHECKING:#x1B[90m#x1B[39;49;00m
            #x1B[90m# _start_tls_connection is unreachable in the current code path#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[90m# if sslcontext is None.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94massert#x1B[39;49;00m sslcontext #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94masync#x1B[39;49;00m #x1B[94mwith#x1B[39;49;00m ceil_timeout(#x1B[90m#x1B[39;49;00m
                timeout.sock_connect, ceil_threshold=timeout.ceil_threshold#x1B[90m#x1B[39;49;00m
            ):#x1B[90m#x1B[39;49;00m
                #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    #x1B[90m# ssl_shutdown_timeout is only available in Python 3.11+#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[94mif#x1B[39;49;00m sys.version_info >= (#x1B[94m3#x1B[39;49;00m, #x1B[94m11#x1B[39;49;00m) #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._ssl_shutdown_timeout:#x1B[90m#x1B[39;49;00m
                        tls_transport = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._loop.start_tls(#x1B[90m#x1B[39;49;00m
                            underlying_transport,#x1B[90m#x1B[39;49;00m
                            tls_proto,#x1B[90m#x1B[39;49;00m
                            sslcontext,#x1B[90m#x1B[39;49;00m
                            server_hostname=req.server_hostname #x1B[95mor#x1B[39;49;00m req.url.raw_host,#x1B[90m#x1B[39;49;00m
                            ssl_handshake_timeout=timeout.total,#x1B[90m#x1B[39;49;00m
                            ssl_shutdown_timeout=#x1B[96mself#x1B[39;49;00m._ssl_shutdown_timeout,#x1B[90m#x1B[39;49;00m
                        )#x1B[90m#x1B[39;49;00m
                    #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                        tls_transport = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._loop.start_tls(#x1B[90m#x1B[39;49;00m
                            underlying_transport,#x1B[90m#x1B[39;49;00m
                            tls_proto,#x1B[90m#x1B[39;49;00m
                            sslcontext,#x1B[90m#x1B[39;49;00m
                            server_hostname=req.server_hostname #x1B[95mor#x1B[39;49;00m req.url.raw_host,#x1B[90m#x1B[39;49;00m
                            ssl_handshake_timeout=timeout.total,#x1B[90m#x1B[39;49;00m
                        )#x1B[90m#x1B[39;49;00m
                #x1B[94mexcept#x1B[39;49;00m #x1B[96mBaseException#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    #x1B[90m# We need to close the underlying transport since#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[90m# `start_tls()` probably failed before it had a#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[90m# chance to do this:#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._ssl_shutdown_timeout == #x1B[94m0#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                        underlying_transport.abort()#x1B[90m#x1B[39;49;00m
                    #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                        underlying_transport.close()#x1B[90m#x1B[39;49;00m
                    #x1B[94mraise#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(tls_transport, asyncio.Transport):#x1B[90m#x1B[39;49;00m
                    fingerprint = #x1B[96mself#x1B[39;49;00m._get_fingerprint(req)#x1B[90m#x1B[39;49;00m
                    #x1B[94mif#x1B[39;49;00m fingerprint:#x1B[90m#x1B[39;49;00m
                        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                            fingerprint.check(tls_transport)#x1B[90m#x1B[39;49;00m
                        #x1B[94mexcept#x1B[39;49;00m ServerFingerprintMismatch:#x1B[90m#x1B[39;49;00m
                            tls_transport.close()#x1B[90m#x1B[39;49;00m
                            #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._cleanup_closed_disabled:#x1B[90m#x1B[39;49;00m
                                #x1B[96mself#x1B[39;49;00m._cleanup_closed_transports.append(tls_transport)#x1B[90m#x1B[39;49;00m
                            #x1B[94mraise#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m cert_errors #x1B[94mas#x1B[39;49;00m exc:#x1B[90m#x1B[39;49;00m
>           #x1B[94mraise#x1B[39;49;00m ClientConnectorCertificateError(req.connection_key, exc) #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mexc#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE           aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host example.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1032)')]#x1B[0m

client_error = <class 'aiohttp.client_exceptions.ClientConnectorError'>
req        = <aiohttp.client_reqrep.ClientRequest object at 0x10545a990>
self       = <aiohttp.connector.TCPConnector object at 0x105c07890>
sslcontext = <ssl.SSLContext object at 0x106dc02d0>
timeout    = ClientTimeout(total=300, connect=None, sock_read=None, sock_connect=30, ceil_threshold=5)
tls_proto  = <aiohttp.client_proto.ResponseHandler object at 0x107404b90>
underlying_transport = <uvloop.loop._SSLProtocolTransport object at 0x1056ecc40>

#x1B[1m#x1B[31maiohttp/connector.py#x1B[0m:1358: ClientConnectorCertificateError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@codspeed-hq
Copy link

codspeed-hq bot commented Feb 14, 2026

Merging this PR will not alter performance

✅ 59 untouched benchmarks


Comparing Dreamsorcerer-patch-6 (6d32525) with master (100e5ed)

Open in CodSpeed

@Dreamsorcerer Dreamsorcerer changed the title Test static path resolution on Windows Test static path traversal on Windows Feb 14, 2026
@Dreamsorcerer Dreamsorcerer marked this pull request as draft February 14, 2026 20:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-3.13 Trigger automatic backporting to the 3.13 release branch by Patchback robot backport-3.14 Trigger automatic backporting to the 3.14 release branch by Patchback robot bot:chronographer:skip This PR does not need to include a change note

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments