Skip to content

Conversation

bmourgues
Copy link

@bmourgues bmourgues commented Jun 23, 2025

❓ What kind of change does this PR introduce?

  • 🐞 bug fix
  • 🐣 feature
  • πŸ“‹ docs update
  • πŸ“‹ tests/coverage improvement
  • πŸ“‹ refactoring
  • πŸ’₯ other

πŸ“‹ What is the related issue number (starting with #)

Resolves #748
Resolves #709

❓ What is the current behavior? (You can also link to an open issue here)

❓ What is the new behavior (if this is a feature change)?

πŸ“‹ Other information:

πŸ“‹ Contribution checklist:

(If you're a first-timer, check out
this guide on making great pull requests)

  • I wrote descriptive pull request text above
  • I think the code is well written
  • I wrote good commit messages
  • I have squashed related commits together after
    the changes have been approved
  • Unit tests for the changes exist
  • Integration tests for the changes exist (if applicable)
  • I used the same coding conventions as the rest of the project
  • The new code doesn't generate linter offenses
  • Documentation reflects the changes
  • The PR relates to only one subject with a clear title
    and description in grammatically correct, complete sentences

This change is Reviewable

Copy link

codecov bot commented Jun 23, 2025

❌ 21 Tests Failed:

Tests completed Failed Passed Skipped
183 21 162 3
View the top 3 failed test(s) by shortest run time
cheroot.test.test_ssl::test_ssl_env[0-True-builtin]
Stack Traces | 0.109s run time
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
method = 'GET', url = '/env', body = None
headers = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=0.1, read=0.1, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None
response_kw = {'decode_content': False, 'preload_content': False}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/env', query=None, fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92murlopen#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        method,#x1B[90m#x1B[39;49;00m
        url,#x1B[90m#x1B[39;49;00m
        body=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        headers=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        retries=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        redirect=#x1B[94mTrue#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        assert_same_host=#x1B[94mTrue#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        timeout=_Default,#x1B[90m#x1B[39;49;00m
        pool_timeout=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        release_conn=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        chunked=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        body_pos=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        **response_kw#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""#x1B[39;49;00m
    #x1B[33m    Get a connection from the pool and perform an HTTP request. This is the#x1B[39;49;00m
    #x1B[33m    lowest level call for making a request, so you'll need to specify all#x1B[39;49;00m
    #x1B[33m    the raw details.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    .. note::#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m       More commonly, it's appropriate to use a convenience method provided#x1B[39;49;00m
    #x1B[33m       by :class:`.RequestMethods`, such as :meth:`request`.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    .. note::#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m       `release_conn` will only behave as expected if#x1B[39;49;00m
    #x1B[33m       `preload_content=False` because we want to make#x1B[39;49;00m
    #x1B[33m       `preload_content=False` the default behaviour someday soon without#x1B[39;49;00m
    #x1B[33m       breaking backwards compatibility.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param method:#x1B[39;49;00m
    #x1B[33m        HTTP request method (such as GET, POST, PUT, etc.)#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param url:#x1B[39;49;00m
    #x1B[33m        The URL to perform the request on.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param body:#x1B[39;49;00m
    #x1B[33m        Data to send in the request body, either :class:`str`, :class:`bytes`,#x1B[39;49;00m
    #x1B[33m        an iterable of :class:`str`/:class:`bytes`, or a file-like object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param headers:#x1B[39;49;00m
    #x1B[33m        Dictionary of custom headers to send, such as User-Agent,#x1B[39;49;00m
    #x1B[33m        If-None-Match, etc. If None, pool headers are used. If provided,#x1B[39;49;00m
    #x1B[33m        these headers completely replace any pool-specific headers.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param retries:#x1B[39;49;00m
    #x1B[33m        Configure the number of retries to allow before raising a#x1B[39;49;00m
    #x1B[33m        :class:`~urllib3.exceptions.MaxRetryError` exception.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m        Pass ``None`` to retry until you receive a response. Pass a#x1B[39;49;00m
    #x1B[33m        :class:`~urllib3.util.retry.Retry` object for fine-grained control#x1B[39;49;00m
    #x1B[33m        over different types of retries.#x1B[39;49;00m
    #x1B[33m        Pass an integer number to retry connection errors that many times,#x1B[39;49;00m
    #x1B[33m        but no other types of errors. Pass zero to never retry.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m        If ``False``, then retries are disabled and any exception is raised#x1B[39;49;00m
    #x1B[33m        immediately. Also, instead of raising a MaxRetryError on redirects,#x1B[39;49;00m
    #x1B[33m        the redirect response will be returned.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param redirect:#x1B[39;49;00m
    #x1B[33m        If True, automatically handle redirects (status codes 301, 302,#x1B[39;49;00m
    #x1B[33m        303, 307, 308). Each redirect counts as a retry. Disabling retries#x1B[39;49;00m
    #x1B[33m        will disable redirect, too.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param assert_same_host:#x1B[39;49;00m
    #x1B[33m        If ``True``, will make sure that the host of the pool requests is#x1B[39;49;00m
    #x1B[33m        consistent else will raise HostChangedError. When ``False``, you can#x1B[39;49;00m
    #x1B[33m        use the pool on an HTTP proxy and request foreign hosts.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param timeout:#x1B[39;49;00m
    #x1B[33m        If specified, overrides the default timeout for this one#x1B[39;49;00m
    #x1B[33m        request. It may be a float (in seconds) or an instance of#x1B[39;49;00m
    #x1B[33m        :class:`urllib3.util.Timeout`.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param pool_timeout:#x1B[39;49;00m
    #x1B[33m        If set and the pool is set to block=True, then this method will#x1B[39;49;00m
    #x1B[33m        block for ``pool_timeout`` seconds and raise EmptyPoolError if no#x1B[39;49;00m
    #x1B[33m        connection is available within the time period.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param release_conn:#x1B[39;49;00m
    #x1B[33m        If False, then the urlopen call will not release the connection#x1B[39;49;00m
    #x1B[33m        back into the pool once a response is received (but will release if#x1B[39;49;00m
    #x1B[33m        you read the entire contents of the response such as when#x1B[39;49;00m
    #x1B[33m        `preload_content=True`). This is useful if you're not preloading#x1B[39;49;00m
    #x1B[33m        the response's content immediately. You will need to call#x1B[39;49;00m
    #x1B[33m        ``r.release_conn()`` on the response ``r`` to return the connection#x1B[39;49;00m
    #x1B[33m        back into the pool. If None, it takes the value of#x1B[39;49;00m
    #x1B[33m        ``response_kw.get('preload_content', True)``.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param chunked:#x1B[39;49;00m
    #x1B[33m        If True, urllib3 will send the body using chunked transfer#x1B[39;49;00m
    #x1B[33m        encoding. Otherwise, urllib3 will send the body using the standard#x1B[39;49;00m
    #x1B[33m        content-length form. Defaults to False.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param int body_pos:#x1B[39;49;00m
    #x1B[33m        Position to seek to in file-like body in the event of a retry or#x1B[39;49;00m
    #x1B[33m        redirect. Typically this won't need to be set because urllib3 will#x1B[39;49;00m
    #x1B[33m        auto-populate the value when needed.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param \\**response_kw:#x1B[39;49;00m
    #x1B[33m        Additional parameters are passed to#x1B[39;49;00m
    #x1B[33m        :meth:`urllib3.response.HTTPResponse.from_httplib`#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        parsed_url = parse_url(url)#x1B[90m#x1B[39;49;00m
        destination_scheme = parsed_url.scheme#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m headers #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            headers = #x1B[96mself#x1B[39;49;00m.headers#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(retries, Retry):#x1B[90m#x1B[39;49;00m
            retries = Retry.from_int(retries, redirect=redirect, default=#x1B[96mself#x1B[39;49;00m.retries)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m release_conn #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            release_conn = response_kw.get(#x1B[33m"#x1B[39;49;00m#x1B[33mpreload_content#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94mTrue#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Check host#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m assert_same_host #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.is_same_host(url):#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m HostChangedError(#x1B[96mself#x1B[39;49;00m, url, retries)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Ensure that the URL we're connecting to is properly encoded#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m url.startswith(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            url = six.ensure_str(_encode_target(url))#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            url = six.ensure_str(parsed_url.url)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        conn = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Track whether `conn` needs to be released before#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# returning/raising/recursing. Update this variable if necessary, and#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# leave `release_conn` constant throughout the function. That way, if#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# the function recurses, the original value of `release_conn` will be#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# passed down into the recursive call, and its value will be respected.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m##x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# See issue #651 [1] for details.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m##x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# [1] <https://github..../urllib3/issues/651>#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        release_this_conn = release_conn#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        http_tunnel_required = connection_requires_http_tunnel(#x1B[90m#x1B[39;49;00m
            #x1B[96mself#x1B[39;49;00m.proxy, #x1B[96mself#x1B[39;49;00m.proxy_config, destination_scheme#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Merge the proxy headers. Only done when not using HTTP CONNECT. We#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# have to copy the headers dict so we can safely change it without those#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# changes being reflected in anyone else's copy.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m http_tunnel_required:#x1B[90m#x1B[39;49;00m
            headers = headers.copy()#x1B[90m#x1B[39;49;00m
            headers.update(#x1B[96mself#x1B[39;49;00m.proxy_headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Must keep the exception bound to a separate variable or else Python 3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# complains about UnboundLocalError.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        err = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Keep track of whether we cleanly exited the except block. This#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# ensures we do proper cleanup in finally.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        clean_exit = #x1B[94mFalse#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Rewind body position, if needed. Record current position#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# for future rewinds in the event of a redirect/retry.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        body_pos = set_file_position(body, body_pos)#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# Request a connection from the queue.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            timeout_obj = #x1B[96mself#x1B[39;49;00m._get_timeout(timeout)#x1B[90m#x1B[39;49;00m
            conn = #x1B[96mself#x1B[39;49;00m._get_conn(timeout=pool_timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            conn.timeout = timeout_obj.connect_timeout#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            is_new_proxy_conn = #x1B[96mself#x1B[39;49;00m.proxy #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mgetattr#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                conn, #x1B[33m"#x1B[39;49;00m#x1B[33msock#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m is_new_proxy_conn #x1B[95mand#x1B[39;49;00m http_tunnel_required:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m._prepare_proxy(conn)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[90m# Make the request on the httplib connection object.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>           httplib_response = #x1B[96mself#x1B[39;49;00m._make_request(#x1B[90m#x1B[39;49;00m
                conn,#x1B[90m#x1B[39;49;00m
                method,#x1B[90m#x1B[39;49;00m
                url,#x1B[90m#x1B[39;49;00m
                timeout=timeout_obj,#x1B[90m#x1B[39;49;00m
                body=body,#x1B[90m#x1B[39;49;00m
                headers=headers,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

_is_ssl_error_message_from_http_proxy = <function HTTPConnectionPool.urlopen.<locals>._is_ssl_error_message_from_http_proxy at 0x7f96244ea2a0>
assert_same_host = False
body       = None
body_pos   = None
chunked    = False
clean_exit = False
conn       = None
destination_scheme = None
err        = None
headers    = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
http_tunnel_required = False
is_new_proxy_conn = False
method     = 'GET'
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/env', query=None, fragment=None)
pool_timeout = None
redirect   = False
release_conn = False
release_this_conn = True
response_kw = {'decode_content': False, 'preload_content': False}
retries    = Retry(total=0, connect=None, read=False, redirect=None, status=None)
self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
timeout    = Timeout(connect=0.1, read=0.1, total=None)
timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
url        = '/env'

#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:715: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:404: in _make_request
    #x1B[0m#x1B[96mself#x1B[39;49;00m._validate_conn(conn)#x1B[90m#x1B[39;49;00m
        chunked    = False
        conn       = <urllib3.connection.HTTPSConnection object at 0x7f96243ce810>
        httplib_request_kw = {'body': None, 'headers': {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}}
        method     = 'GET'
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
        timeout    = Timeout(connect=0.1, read=0.1, total=None)
        timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
        url        = '/env'
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:1058: in _validate_conn
    #x1B[0mconn.connect()#x1B[90m#x1B[39;49;00m
        __class__  = <class 'urllib3.connectionpool.HTTPSConnectionPool'>
        conn       = <urllib3.connection.HTTPSConnection object at 0x7f96243ce810>
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
#x1B[1m#x1B[31m..../py/lib/python3.11.../site-packages/urllib3/connection.py#x1B[0m:419: in connect
    #x1B[0m#x1B[96mself#x1B[39;49;00m.sock = ssl_wrap_socket(#x1B[90m#x1B[39;49;00m
        conn       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        context    = <ssl.SSLContext object at 0x7f96244531d0>
        default_ssl_context = True
        hostname   = '127.0.0.1'
        is_time_off = False
        self       = <urllib3.connection.HTTPSConnection object at 0x7f96243ce810>
        server_hostname = '127.0.0.1'
        tls_in_tls = False
#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/ssl_.py#x1B[0m:453: in ssl_wrap_socket
    #x1B[0mssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)#x1B[90m#x1B[39;49;00m
        ca_cert_data = None
        ca_cert_dir = None
        ca_certs   = '/tmp/tmpiwnib2z2.pem'
        cert_reqs  = None
        certfile   = '/tmp/tmpgkdjk1b6.pem'
        ciphers    = None
        context    = <ssl.SSLContext object at 0x7f96244531d0>
        key_password = None
        keyfile    = None
        send_sni   = False
        server_hostname = '127.0.0.1'
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        ssl_context = <ssl.SSLContext object at 0x7f96244531d0>
        ssl_version = None
        tls_in_tls = False
        use_sni_hostname = False
#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/ssl_.py#x1B[0m:495: in _ssl_wrap_socket_impl
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m ssl_context.wrap_socket(sock)#x1B[90m#x1B[39;49;00m
        server_hostname = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        ssl_context = <ssl.SSLContext object at 0x7f96244531d0>
        tls_in_tls = False
#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:517: in wrap_socket
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.sslsocket_class._create(#x1B[90m#x1B[39;49;00m
        do_handshake_on_connect = True
        self       = <ssl.SSLContext object at 0x7f96244531d0>
        server_hostname = None
        server_side = False
        session    = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        suppress_ragged_eofs = True
#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:1104: in _create
    #x1B[0m#x1B[96mself#x1B[39;49;00m.do_handshake()#x1B[90m#x1B[39;49;00m
        __class__  = <class 'ssl.SSLSocket'>
        cls        = <class 'ssl.SSLSocket'>
        connected  = True
        context    = <ssl.SSLContext object at 0x7f96244531d0>
        do_handshake_on_connect = True
        kwargs     = {'family': <AddressFamily.AF_INET: 2>, 'fileno': 16, 'proto': 6, 'type': <SocketKind.SOCK_STREAM: 1>}
        self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>
        server_hostname = None
        server_side = False
        session    = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        sock_timeout = 0.1
        suppress_ragged_eofs = True
        timeout    = 0.1
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>, block = False

    #x1B[0m#x1B[37m@_sslcopydoc#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m #x1B[92mdo_handshake#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m, block=#x1B[94mFalse#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m._check_connected()#x1B[90m#x1B[39;49;00m
        timeout = #x1B[96mself#x1B[39;49;00m.gettimeout()#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m timeout == #x1B[94m0.0#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m block:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.settimeout(#x1B[94mNone#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.SSLEOFError: [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)#x1B[0m

block      = False
self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>
timeout    = 0.1

#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:1382: SSLEOFError

#x1B[33mDuring handling of the above exception, another exception occurred:#x1B[0m

self = <requests.adapters.HTTPAdapter object at 0x7f96243cf810>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=0.1, read=0.1, total=None)
verify = '/tmp/tmpiwnib2z2.pem', cert = '/tmp/tmpgkdjk1b6.pem'
proxies = OrderedDict()

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92msend#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m, request, stream=#x1B[94mFalse#x1B[39;49;00m, timeout=#x1B[94mNone#x1B[39;49;00m, verify=#x1B[94mTrue#x1B[39;49;00m, cert=#x1B[94mNone#x1B[39;49;00m, proxies=#x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Sends PreparedRequest object. Returns Response object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.#x1B[39;49;00m
    #x1B[33m    :param stream: (optional) Whether to stream the request content.#x1B[39;49;00m
    #x1B[33m    :param timeout: (optional) How long to wait for the server to send#x1B[39;49;00m
    #x1B[33m        data before giving up, as a float, or a :ref:`(connect timeout,#x1B[39;49;00m
    #x1B[33m        read timeout) <timeouts>` tuple.#x1B[39;49;00m
    #x1B[33m    :type timeout: float or tuple or urllib3 Timeout object#x1B[39;49;00m
    #x1B[33m    :param verify: (optional) Either a boolean, in which case it controls whether#x1B[39;49;00m
    #x1B[33m        we verify the server's TLS certificate, or a string, in which case it#x1B[39;49;00m
    #x1B[33m        must be a path to a CA bundle to use#x1B[39;49;00m
    #x1B[33m    :param cert: (optional) Any user-provided SSL certificate to be trusted.#x1B[39;49;00m
    #x1B[33m    :param proxies: (optional) The proxies dictionary to apply to the request.#x1B[39;49;00m
    #x1B[33m    :rtype: requests.Response#x1B[39;49;00m
    #x1B[33m    """#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
            conn = #x1B[96mself#x1B[39;49;00m.get_connection(request.url, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m LocationValueError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m InvalidURL(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.cert_verify(conn, request.url, verify, cert)#x1B[90m#x1B[39;49;00m
        url = #x1B[96mself#x1B[39;49;00m.request_url(request, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.add_headers(#x1B[90m#x1B[39;49;00m
            request,#x1B[90m#x1B[39;49;00m
            stream=stream,#x1B[90m#x1B[39;49;00m
            timeout=timeout,#x1B[90m#x1B[39;49;00m
            verify=verify,#x1B[90m#x1B[39;49;00m
            cert=cert,#x1B[90m#x1B[39;49;00m
            proxies=proxies,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        chunked = #x1B[95mnot#x1B[39;49;00m (request.body #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mContent-Length#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95min#x1B[39;49;00m request.headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, #x1B[96mtuple#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect, read = timeout#x1B[90m#x1B[39;49;00m
                timeout = TimeoutSauce(connect=connect, read=read)#x1B[90m#x1B[39;49;00m
            #x1B[94mexcept#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mInvalid timeout #x1B[39;49;00m#x1B[33m{#x1B[39;49;00mtimeout#x1B[33m}#x1B[39;49;00m#x1B[33m. Pass a (connect, read) timeout tuple, #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mor a single float to set both timeouts to the same value.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, TimeoutSauce):#x1B[90m#x1B[39;49;00m
            #x1B[94mpass#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            timeout = TimeoutSauce(connect=timeout, read=timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           resp = conn.urlopen(#x1B[90m#x1B[39;49;00m
                method=request.method,#x1B[90m#x1B[39;49;00m
                url=url,#x1B[90m#x1B[39;49;00m
                body=request.body,#x1B[90m#x1B[39;49;00m
                headers=request.headers,#x1B[90m#x1B[39;49;00m
                redirect=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                assert_same_host=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                preload_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                decode_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                retries=#x1B[96mself#x1B[39;49;00m.max_retries,#x1B[90m#x1B[39;49;00m
                timeout=timeout,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

cert       = '/tmp/tmpgkdjk1b6.pem'
chunked    = False
conn       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
proxies    = OrderedDict()
request    = <PreparedRequest [GET]>
self       = <requests.adapters.HTTPAdapter object at 0x7f96243cf810>
stream     = False
timeout    = Timeout(connect=0.1, read=0.1, total=None)
url        = '/env'
verify     = '/tmp/tmpiwnib2z2.pem'

#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/adapters.py#x1B[0m:486: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:799: in urlopen
    #x1B[0mretries = retries.increment(#x1B[90m#x1B[39;49;00m
        _is_ssl_error_message_from_http_proxy = <function HTTPConnectionPool.urlopen.<locals>._is_ssl_error_message_from_http_proxy at 0x7f96244ea2a0>
        assert_same_host = False
        body       = None
        body_pos   = None
        chunked    = False
        clean_exit = False
        conn       = None
        destination_scheme = None
        err        = None
        headers    = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
        http_tunnel_required = False
        is_new_proxy_conn = False
        method     = 'GET'
        parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/env', query=None, fragment=None)
        pool_timeout = None
        redirect   = False
        release_conn = False
        release_this_conn = True
        response_kw = {'decode_content': False, 'preload_content': False}
        retries    = Retry(total=0, connect=None, read=False, redirect=None, status=None)
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
        timeout    = Timeout(connect=0.1, read=0.1, total=None)
        timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
        url        = '/env'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
method = 'GET', url = '/env', response = None
error = SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))
_pool = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
_stacktrace = <traceback object at 0x7f9624257a40>

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92mincrement#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        method=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        url=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        response=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        error=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        _pool=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        _stacktrace=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Return a new Retry object with incremented retry counters.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param response: A response object, or None, if the server did not#x1B[39;49;00m
    #x1B[33m        return a response.#x1B[39;49;00m
    #x1B[33m    :type response: :class:`~urllib3.response.HTTPResponse`#x1B[39;49;00m
    #x1B[33m    :param Exception error: An error encountered during the request, or#x1B[39;49;00m
    #x1B[33m        None if the response was received successfully.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :return: A new ``Retry`` object.#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.total #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m error:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Disabled, indicate to re-raise the error.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        total = #x1B[96mself#x1B[39;49;00m.total#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m total #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            total -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        connect = #x1B[96mself#x1B[39;49;00m.connect#x1B[90m#x1B[39;49;00m
        read = #x1B[96mself#x1B[39;49;00m.read#x1B[90m#x1B[39;49;00m
        redirect = #x1B[96mself#x1B[39;49;00m.redirect#x1B[90m#x1B[39;49;00m
        status_count = #x1B[96mself#x1B[39;49;00m.status#x1B[90m#x1B[39;49;00m
        other = #x1B[96mself#x1B[39;49;00m.other#x1B[90m#x1B[39;49;00m
        cause = #x1B[33m"#x1B[39;49;00m#x1B[33munknown#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        status = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        redirect_location = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m error #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_connection_error(error):#x1B[90m#x1B[39;49;00m
            #x1B[90m# Connect retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m connect #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m connect #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m error #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_read_error(error):#x1B[90m#x1B[39;49;00m
            #x1B[90m# Read retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m read #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_method_retryable(method):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m read #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                read -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m error:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Other retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m other #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                other -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m response #x1B[95mand#x1B[39;49;00m response.get_redirect_location():#x1B[90m#x1B[39;49;00m
            #x1B[90m# Redirect retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m redirect #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                redirect -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            cause = #x1B[33m"#x1B[39;49;00m#x1B[33mtoo many redirects#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            redirect_location = response.get_redirect_location()#x1B[90m#x1B[39;49;00m
            status = response.status#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Incrementing because of a server error like a 500 in#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[90m# status_forcelist and the given method is in the allowed_methods#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            cause = ResponseError.GENERIC_ERROR#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m response #x1B[95mand#x1B[39;49;00m response.status:#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m status_count #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    status_count -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)#x1B[90m#x1B[39;49;00m
                status = response.status#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        history = #x1B[96mself#x1B[39;49;00m.history + (#x1B[90m#x1B[39;49;00m
            RequestHistory(method, url, error, status, redirect_location),#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        new_retry = #x1B[96mself#x1B[39;49;00m.new(#x1B[90m#x1B[39;49;00m
            total=total,#x1B[90m#x1B[39;49;00m
            connect=connect,#x1B[90m#x1B[39;49;00m
            read=read,#x1B[90m#x1B[39;49;00m
            redirect=redirect,#x1B[90m#x1B[39;49;00m
            status=status_count,#x1B[90m#x1B[39;49;00m
            other=other,#x1B[90m#x1B[39;49;00m
            history=history,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m new_retry.is_exhausted():#x1B[90m#x1B[39;49;00m
>           #x1B[94mraise#x1B[39;49;00m MaxRetryError(_pool, url, error #x1B[95mor#x1B[39;49;00m ResponseError(cause))#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE           urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='127.0.0.1', port=40897): Max retries exceeded with url: /env (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')))#x1B[0m

_pool      = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
_stacktrace = <traceback object at 0x7f9624257a40>
cause      = 'unknown'
connect    = None
error      = SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))
history    = (RequestHistory(method='GET', url='/env', error=SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')), status=None, redirect_location=None),)
method     = 'GET'
new_retry  = Retry(total=-1, connect=None, read=False, redirect=None, status=None)
other      = None
read       = False
redirect   = None
redirect_location = None
response   = None
self       = Retry(total=0, connect=None, read=False, redirect=None, status=None)
status     = None
status_count = None
total      = -1
url        = '/env'

#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/retry.py#x1B[0m:592: MaxRetryError

#x1B[33mDuring handling of the above exception, another exception occurred:#x1B[0m

thread_exceptions = [], recwarn = WarningsRecorder(record=True)
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f962454ec90>
http_request_timeout = 0.1
tls_http_server = functools.partial(<function make_tls_http_server at 0x7f962c624cc0>, request=<SubRequest 'tls_http_server' for <Function test_ssl_env[0-True-builtin]>>)
adapter_type = 'builtin', ca = <trustme.CA object at 0x7f962454e610>
tls_verify_mode = <VerifyMode.CERT_NONE: 0>
tls_certificate = <trustme.LeafCert object at 0x7f962454e090>
tls_certificate_chain_pem_path = '/tmp/tmpmkhrri7d.pem'
tls_certificate_private_key_pem_path = '/tmp/tmpl7dxe9ky.pem'
tls_ca_certificate_pem_path = '/tmp/tmpiwnib2z2.pem', use_client_cert = True

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(  #x1B[90m# noqa: C901  # FIXME#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[33m'#x1B[39;49;00m#x1B[33madapter_type#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            pytest.param(#x1B[90m#x1B[39;49;00m
                #x1B[33m'#x1B[39;49;00m#x1B[33mbuiltin#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                marks=pytest.mark.xfail(#x1B[90m#x1B[39;49;00m
                    IS_MACOS #x1B[95mand#x1B[39;49;00m PY310_PLUS,#x1B[90m#x1B[39;49;00m
                    reason=#x1B[33m'#x1B[39;49;00m#x1B[33mUnclosed TLS resource warnings happen on macOS #x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33m'#x1B[39;49;00m#x1B[33munder Python 3.10 (#508)#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                    strict=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                ),#x1B[90m#x1B[39;49;00m
            ),#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33mpyopenssl#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[90m#x1B[39;49;00m
        (#x1B[33m'#x1B[39;49;00m#x1B[33mtls_verify_mode#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33muse_client_cert#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            (ssl.CERT_NONE, #x1B[94mFalse#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_NONE, #x1B[94mTrue#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_OPTIONAL, #x1B[94mFalse#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_OPTIONAL, #x1B[94mTrue#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_REQUIRED, #x1B[94mTrue#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m #x1B[92mtest_ssl_env#x1B[39;49;00m(  #x1B[90m# noqa: C901  # FIXME#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        thread_exceptions,#x1B[90m#x1B[39;49;00m
        recwarn,#x1B[90m#x1B[39;49;00m
        mocker,#x1B[90m#x1B[39;49;00m
        http_request_timeout,#x1B[90m#x1B[39;49;00m
        tls_http_server,#x1B[90m#x1B[39;49;00m
        adapter_type,#x1B[90m#x1B[39;49;00m
        ca,#x1B[90m#x1B[39;49;00m
        tls_verify_mode,#x1B[90m#x1B[39;49;00m
        tls_certificate,#x1B[90m#x1B[39;49;00m
        tls_certificate_chain_pem_path,#x1B[90m#x1B[39;49;00m
        tls_certificate_private_key_pem_path,#x1B[90m#x1B[39;49;00m
        tls_ca_certificate_pem_path,#x1B[90m#x1B[39;49;00m
        use_client_cert,#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Test the SSL environment generated by the SSL adapters."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        interface, _host, port = _get_conn_data(ANY_INTERFACE_IPV4)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mwith#x1B[39;49;00m mocker.mock_module.patch(#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33midna.core.ulabel#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            return_value=ntob(#x1B[33m'#x1B[39;49;00m#x1B[33m127.0.0.1#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        ):#x1B[90m#x1B[39;49;00m
            client_cert = ca.issue_cert(ntou(#x1B[33m'#x1B[39;49;00m#x1B[33m127.0.0.1#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mwith#x1B[39;49;00m client_cert.private_key_and_cert_chain_pem.tempfile() #x1B[94mas#x1B[39;49;00m cl_pem:#x1B[90m#x1B[39;49;00m
            tls_adapter_cls = get_ssl_adapter_class(name=adapter_type)#x1B[90m#x1B[39;49;00m
            tls_adapter = tls_adapter_cls(#x1B[90m#x1B[39;49;00m
                tls_certificate_chain_pem_path,#x1B[90m#x1B[39;49;00m
                tls_certificate_private_key_pem_path,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m adapter_type == #x1B[33m'#x1B[39;49;00m#x1B[33mpyopenssl#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                tls_adapter.context = tls_adapter.get_context()#x1B[90m#x1B[39;49;00m
                tls_adapter.context.set_verify(#x1B[90m#x1B[39;49;00m
                    _stdlib_to_openssl_verify[tls_verify_mode],#x1B[90m#x1B[39;49;00m
                    #x1B[94mlambda#x1B[39;49;00m conn, cert, errno, depth, preverify_ok: preverify_ok,#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_adapter.context.verify_mode = tls_verify_mode#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            ca.configure_trust(tls_adapter.context)#x1B[90m#x1B[39;49;00m
            tls_certificate.configure_cert(tls_adapter.context)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            tlswsgiserver = tls_http_server((interface, port), tls_adapter)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            interface, _host, port = _get_conn_data(tlswsgiserver.bind_addr)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>           resp = requests.get(#x1B[90m#x1B[39;49;00m
                #x1B[33m'#x1B[39;49;00m#x1B[33mhttps://#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m + interface + #x1B[33m'#x1B[39;49;00m#x1B[33m:#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m + #x1B[96mstr#x1B[39;49;00m(port) + #x1B[33m'#x1B[39;49;00m#x1B[33m/env#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                timeout=http_request_timeout,#x1B[90m#x1B[39;49;00m
                verify=tls_ca_certificate_pem_path,#x1B[90m#x1B[39;49;00m
                cert=cl_pem #x1B[94mif#x1B[39;49;00m use_client_cert #x1B[94melse#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

_host      = '127.0.0.1'
adapter_type = 'builtin'
ca         = <trustme.CA object at 0x7f962454e610>
cl_pem     = '/tmp/tmpgkdjk1b6.pem'
client_cert = <trustme.LeafCert object at 0x7f962454cc50>
http_request_timeout = 0.1
interface  = '127.0.0.1'
mocker     = <pytest_mock.plugin.MockerFixture object at 0x7f962454ec90>
port       = 40897
recwarn    = WarningsRecorder(record=True)
thread_exceptions = []
tls_adapter = <cheroot.ssl.builtin.BuiltinSSLAdapter object at 0x7f962454ca50>
tls_adapter_cls = <class 'cheroot.ssl.builtin.BuiltinSSLAdapter'>
tls_ca_certificate_pem_path = '/tmp/tmpiwnib2z2.pem'
tls_certificate = <trustme.LeafCert object at 0x7f962454e090>
tls_certificate_chain_pem_path = '/tmp/tmpmkhrri7d.pem'
tls_certificate_private_key_pem_path = '/tmp/tmpl7dxe9ky.pem'
tls_http_server = functools.partial(<function make_tls_http_server at 0x7f962c624cc0>, request=<SubRequest 'tls_http_server' for <Function test_ssl_env[0-True-builtin]>>)
tls_verify_mode = <VerifyMode.CERT_NONE: 0>
tlswsgiserver = <cheroot.server.HTTPServer object at 0x7f96243cfe50>
use_client_cert = True

#x1B[1m#x1B[31mcheroot/test/test_ssl.py#x1B[0m:530: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/api.py#x1B[0m:73: in get
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m request(#x1B[33m"#x1B[39;49;00m#x1B[33mget#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, url, params=params, **kwargs)#x1B[90m#x1B[39;49;00m
        kwargs     = {'cert': '/tmp/tmpgkdjk1b6.pem', 'timeout': 0.1, 'verify': '/tmp/tmpiwnib2z2.pem'}
        params     = None
        url        = 'https://127.0.0.1:40897/env'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/api.py#x1B[0m:59: in request
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m session.request(method=method, url=url, **kwargs)#x1B[90m#x1B[39;49;00m
        kwargs     = {'cert': '/tmp/tmpgkdjk1b6.pem', 'params': None, 'timeout': 0.1, 'verify': '/tmp/tmpiwnib2z2.pem'}
        method     = 'get'
        session    = <requests.sessions.Session object at 0x7f962454cb90>
        url        = 'https://127.0.0.1:40897/env'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/sessions.py#x1B[0m:589: in request
    #x1B[0mresp = #x1B[96mself#x1B[39;49;00m.send(prep, **send_kwargs)#x1B[90m#x1B[39;49;00m
        allow_redirects = True
        auth       = None
        cert       = '/tmp/tmpgkdjk1b6.pem'
        cookies    = None
        data       = None
        files      = None
        headers    = None
        hooks      = None
        json       = None
        method     = 'get'
        params     = None
        prep       = <PreparedRequest [GET]>
        proxies    = {}
        req        = <Request [GET]>
        self       = <requests.sessions.Session object at 0x7f962454cb90>
        send_kwargs = {'allow_redirects': True, 'cert': '/tmp/tmpgkdjk1b6.pem', 'proxies': OrderedDict(), 'stream': False, ...}
        settings   = {'cert': '/tmp/tmpgkdjk1b6.pem', 'proxies': OrderedDict(), 'stream': False, 'verify': '/tmp/tmpiwnib2z2.pem'}
        stream     = None
        timeout    = 0.1
        url        = 'https://127.0.0.1:40897/env'
        verify     = '/tmp/tmpiwnib2z2.pem'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/sessions.py#x1B[0m:703: in send
    #x1B[0mr = adapter.send(request, **kwargs)#x1B[90m#x1B[39;49;00m
        adapter    = <requests.adapters.HTTPAdapter object at 0x7f96243cf810>
        allow_redirects = True
        hooks      = {'response': []}
        kwargs     = {'cert': '/tmp/tmpgkdjk1b6.pem', 'proxies': OrderedDict(), 'stream': False, 'timeout': 0.1, ...}
        request    = <PreparedRequest [GET]>
        self       = <requests.sessions.Session object at 0x7f962454cb90>
        start      = 1750666740.155481
        stream     = False
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7f96243cf810>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=0.1, read=0.1, total=None)
verify = '/tmp/tmpiwnib2z2.pem', cert = '/tmp/tmpgkdjk1b6.pem'
proxies = OrderedDict()

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92msend#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m, request, stream=#x1B[94mFalse#x1B[39;49;00m, timeout=#x1B[94mNone#x1B[39;49;00m, verify=#x1B[94mTrue#x1B[39;49;00m, cert=#x1B[94mNone#x1B[39;49;00m, proxies=#x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Sends PreparedRequest object. Returns Response object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.#x1B[39;49;00m
    #x1B[33m    :param stream: (optional) Whether to stream the request content.#x1B[39;49;00m
    #x1B[33m    :param timeout: (optional) How long to wait for the server to send#x1B[39;49;00m
    #x1B[33m        data before giving up, as a float, or a :ref:`(connect timeout,#x1B[39;49;00m
    #x1B[33m        read timeout) <timeouts>` tuple.#x1B[39;49;00m
    #x1B[33m    :type timeout: float or tuple or urllib3 Timeout object#x1B[39;49;00m
    #x1B[33m    :param verify: (optional) Either a boolean, in which case it controls whether#x1B[39;49;00m
    #x1B[33m        we verify the server's TLS certificate, or a string, in which case it#x1B[39;49;00m
    #x1B[33m        must be a path to a CA bundle to use#x1B[39;49;00m
    #x1B[33m    :param cert: (optional) Any user-provided SSL certificate to be trusted.#x1B[39;49;00m
    #x1B[33m    :param proxies: (optional) The proxies dictionary to apply to the request.#x1B[39;49;00m
    #x1B[33m    :rtype: requests.Response#x1B[39;49;00m
    #x1B[33m    """#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
            conn = #x1B[96mself#x1B[39;49;00m.get_connection(request.url, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m LocationValueError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m InvalidURL(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.cert_verify(conn, request.url, verify, cert)#x1B[90m#x1B[39;49;00m
        url = #x1B[96mself#x1B[39;49;00m.request_url(request, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.add_headers(#x1B[90m#x1B[39;49;00m
            request,#x1B[90m#x1B[39;49;00m
            stream=stream,#x1B[90m#x1B[39;49;00m
            timeout=timeout,#x1B[90m#x1B[39;49;00m
            verify=verify,#x1B[90m#x1B[39;49;00m
            cert=cert,#x1B[90m#x1B[39;49;00m
            proxies=proxies,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        chunked = #x1B[95mnot#x1B[39;49;00m (request.body #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mContent-Length#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95min#x1B[39;49;00m request.headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, #x1B[96mtuple#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect, read = timeout#x1B[90m#x1B[39;49;00m
                timeout = TimeoutSauce(connect=connect, read=read)#x1B[90m#x1B[39;49;00m
            #x1B[94mexcept#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mInvalid timeout #x1B[39;49;00m#x1B[33m{#x1B[39;49;00mtimeout#x1B[33m}#x1B[39;49;00m#x1B[33m. Pass a (connect, read) timeout tuple, #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mor a single float to set both timeouts to the same value.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, TimeoutSauce):#x1B[90m#x1B[39;49;00m
            #x1B[94mpass#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            timeout = TimeoutSauce(connect=timeout, read=timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            resp = conn.urlopen(#x1B[90m#x1B[39;49;00m
                method=request.method,#x1B[90m#x1B[39;49;00m
                url=url,#x1B[90m#x1B[39;49;00m
                body=request.body,#x1B[90m#x1B[39;49;00m
                headers=request.headers,#x1B[90m#x1B[39;49;00m
                redirect=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                assert_same_host=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                preload_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                decode_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                retries=#x1B[96mself#x1B[39;49;00m.max_retries,#x1B[90m#x1B[39;49;00m
                timeout=timeout,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m (ProtocolError, #x1B[96mOSError#x1B[39;49;00m) #x1B[94mas#x1B[39;49;00m err:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m #x1B[96mConnectionError#x1B[39;49;00m(err, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m MaxRetryError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, ConnectTimeoutError):#x1B[90m#x1B[39;49;00m
                #x1B[90m# TODO: Remove this in 3.0.0: see #2811#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, NewConnectionError):#x1B[90m#x1B[39;49;00m
                    #x1B[94mraise#x1B[39;49;00m ConnectTimeout(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, ResponseError):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m RetryError(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, _ProxyError):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m ProxyError(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, _SSLError):#x1B[90m#x1B[39;49;00m
                #x1B[90m# This branch is for urllib3 v1.22 and later.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>               #x1B[94mraise#x1B[39;49;00m SSLError(e, request=request)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               requests.exceptions.SSLError: HTTPSConnectionPool(host='127.0.0.1', port=40897): Max retries exceeded with url: /env (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')))#x1B[0m

cert       = '/tmp/tmpgkdjk1b6.pem'
chunked    = False
conn       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f96243cdad0>
proxies    = OrderedDict()
request    = <PreparedRequest [GET]>
self       = <requests.adapters.HTTPAdapter object at 0x7f96243cf810>
stream     = False
timeout    = Timeout(connect=0.1, read=0.1, total=None)
url        = '/env'
verify     = '/tmp/tmpiwnib2z2.pem'

#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/adapters.py#x1B[0m:517: SSLError
cheroot.test.test_ssl::test_ssl_env[2-True-builtin]
Stack Traces | 0.109s run time
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
method = 'GET', url = '/env', body = None
headers = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=0.1, read=0.1, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None
response_kw = {'decode_content': False, 'preload_content': False}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/env', query=None, fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92murlopen#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        method,#x1B[90m#x1B[39;49;00m
        url,#x1B[90m#x1B[39;49;00m
        body=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        headers=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        retries=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        redirect=#x1B[94mTrue#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        assert_same_host=#x1B[94mTrue#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        timeout=_Default,#x1B[90m#x1B[39;49;00m
        pool_timeout=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        release_conn=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        chunked=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        body_pos=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        **response_kw#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""#x1B[39;49;00m
    #x1B[33m    Get a connection from the pool and perform an HTTP request. This is the#x1B[39;49;00m
    #x1B[33m    lowest level call for making a request, so you'll need to specify all#x1B[39;49;00m
    #x1B[33m    the raw details.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    .. note::#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m       More commonly, it's appropriate to use a convenience method provided#x1B[39;49;00m
    #x1B[33m       by :class:`.RequestMethods`, such as :meth:`request`.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    .. note::#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m       `release_conn` will only behave as expected if#x1B[39;49;00m
    #x1B[33m       `preload_content=False` because we want to make#x1B[39;49;00m
    #x1B[33m       `preload_content=False` the default behaviour someday soon without#x1B[39;49;00m
    #x1B[33m       breaking backwards compatibility.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param method:#x1B[39;49;00m
    #x1B[33m        HTTP request method (such as GET, POST, PUT, etc.)#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param url:#x1B[39;49;00m
    #x1B[33m        The URL to perform the request on.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param body:#x1B[39;49;00m
    #x1B[33m        Data to send in the request body, either :class:`str`, :class:`bytes`,#x1B[39;49;00m
    #x1B[33m        an iterable of :class:`str`/:class:`bytes`, or a file-like object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param headers:#x1B[39;49;00m
    #x1B[33m        Dictionary of custom headers to send, such as User-Agent,#x1B[39;49;00m
    #x1B[33m        If-None-Match, etc. If None, pool headers are used. If provided,#x1B[39;49;00m
    #x1B[33m        these headers completely replace any pool-specific headers.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param retries:#x1B[39;49;00m
    #x1B[33m        Configure the number of retries to allow before raising a#x1B[39;49;00m
    #x1B[33m        :class:`~urllib3.exceptions.MaxRetryError` exception.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m        Pass ``None`` to retry until you receive a response. Pass a#x1B[39;49;00m
    #x1B[33m        :class:`~urllib3.util.retry.Retry` object for fine-grained control#x1B[39;49;00m
    #x1B[33m        over different types of retries.#x1B[39;49;00m
    #x1B[33m        Pass an integer number to retry connection errors that many times,#x1B[39;49;00m
    #x1B[33m        but no other types of errors. Pass zero to never retry.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m        If ``False``, then retries are disabled and any exception is raised#x1B[39;49;00m
    #x1B[33m        immediately. Also, instead of raising a MaxRetryError on redirects,#x1B[39;49;00m
    #x1B[33m        the redirect response will be returned.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param redirect:#x1B[39;49;00m
    #x1B[33m        If True, automatically handle redirects (status codes 301, 302,#x1B[39;49;00m
    #x1B[33m        303, 307, 308). Each redirect counts as a retry. Disabling retries#x1B[39;49;00m
    #x1B[33m        will disable redirect, too.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param assert_same_host:#x1B[39;49;00m
    #x1B[33m        If ``True``, will make sure that the host of the pool requests is#x1B[39;49;00m
    #x1B[33m        consistent else will raise HostChangedError. When ``False``, you can#x1B[39;49;00m
    #x1B[33m        use the pool on an HTTP proxy and request foreign hosts.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param timeout:#x1B[39;49;00m
    #x1B[33m        If specified, overrides the default timeout for this one#x1B[39;49;00m
    #x1B[33m        request. It may be a float (in seconds) or an instance of#x1B[39;49;00m
    #x1B[33m        :class:`urllib3.util.Timeout`.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param pool_timeout:#x1B[39;49;00m
    #x1B[33m        If set and the pool is set to block=True, then this method will#x1B[39;49;00m
    #x1B[33m        block for ``pool_timeout`` seconds and raise EmptyPoolError if no#x1B[39;49;00m
    #x1B[33m        connection is available within the time period.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param release_conn:#x1B[39;49;00m
    #x1B[33m        If False, then the urlopen call will not release the connection#x1B[39;49;00m
    #x1B[33m        back into the pool once a response is received (but will release if#x1B[39;49;00m
    #x1B[33m        you read the entire contents of the response such as when#x1B[39;49;00m
    #x1B[33m        `preload_content=True`). This is useful if you're not preloading#x1B[39;49;00m
    #x1B[33m        the response's content immediately. You will need to call#x1B[39;49;00m
    #x1B[33m        ``r.release_conn()`` on the response ``r`` to return the connection#x1B[39;49;00m
    #x1B[33m        back into the pool. If None, it takes the value of#x1B[39;49;00m
    #x1B[33m        ``response_kw.get('preload_content', True)``.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param chunked:#x1B[39;49;00m
    #x1B[33m        If True, urllib3 will send the body using chunked transfer#x1B[39;49;00m
    #x1B[33m        encoding. Otherwise, urllib3 will send the body using the standard#x1B[39;49;00m
    #x1B[33m        content-length form. Defaults to False.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param int body_pos:#x1B[39;49;00m
    #x1B[33m        Position to seek to in file-like body in the event of a retry or#x1B[39;49;00m
    #x1B[33m        redirect. Typically this won't need to be set because urllib3 will#x1B[39;49;00m
    #x1B[33m        auto-populate the value when needed.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param \\**response_kw:#x1B[39;49;00m
    #x1B[33m        Additional parameters are passed to#x1B[39;49;00m
    #x1B[33m        :meth:`urllib3.response.HTTPResponse.from_httplib`#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        parsed_url = parse_url(url)#x1B[90m#x1B[39;49;00m
        destination_scheme = parsed_url.scheme#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m headers #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            headers = #x1B[96mself#x1B[39;49;00m.headers#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(retries, Retry):#x1B[90m#x1B[39;49;00m
            retries = Retry.from_int(retries, redirect=redirect, default=#x1B[96mself#x1B[39;49;00m.retries)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m release_conn #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            release_conn = response_kw.get(#x1B[33m"#x1B[39;49;00m#x1B[33mpreload_content#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94mTrue#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Check host#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m assert_same_host #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.is_same_host(url):#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m HostChangedError(#x1B[96mself#x1B[39;49;00m, url, retries)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Ensure that the URL we're connecting to is properly encoded#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m url.startswith(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            url = six.ensure_str(_encode_target(url))#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            url = six.ensure_str(parsed_url.url)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        conn = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Track whether `conn` needs to be released before#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# returning/raising/recursing. Update this variable if necessary, and#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# leave `release_conn` constant throughout the function. That way, if#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# the function recurses, the original value of `release_conn` will be#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# passed down into the recursive call, and its value will be respected.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m##x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# See issue #651 [1] for details.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m##x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# [1] <https://github..../urllib3/issues/651>#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        release_this_conn = release_conn#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        http_tunnel_required = connection_requires_http_tunnel(#x1B[90m#x1B[39;49;00m
            #x1B[96mself#x1B[39;49;00m.proxy, #x1B[96mself#x1B[39;49;00m.proxy_config, destination_scheme#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Merge the proxy headers. Only done when not using HTTP CONNECT. We#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# have to copy the headers dict so we can safely change it without those#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# changes being reflected in anyone else's copy.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m http_tunnel_required:#x1B[90m#x1B[39;49;00m
            headers = headers.copy()#x1B[90m#x1B[39;49;00m
            headers.update(#x1B[96mself#x1B[39;49;00m.proxy_headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Must keep the exception bound to a separate variable or else Python 3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# complains about UnboundLocalError.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        err = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Keep track of whether we cleanly exited the except block. This#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# ensures we do proper cleanup in finally.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        clean_exit = #x1B[94mFalse#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Rewind body position, if needed. Record current position#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# for future rewinds in the event of a redirect/retry.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        body_pos = set_file_position(body, body_pos)#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# Request a connection from the queue.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            timeout_obj = #x1B[96mself#x1B[39;49;00m._get_timeout(timeout)#x1B[90m#x1B[39;49;00m
            conn = #x1B[96mself#x1B[39;49;00m._get_conn(timeout=pool_timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            conn.timeout = timeout_obj.connect_timeout#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            is_new_proxy_conn = #x1B[96mself#x1B[39;49;00m.proxy #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mgetattr#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                conn, #x1B[33m"#x1B[39;49;00m#x1B[33msock#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m is_new_proxy_conn #x1B[95mand#x1B[39;49;00m http_tunnel_required:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m._prepare_proxy(conn)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[90m# Make the request on the httplib connection object.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>           httplib_response = #x1B[96mself#x1B[39;49;00m._make_request(#x1B[90m#x1B[39;49;00m
                conn,#x1B[90m#x1B[39;49;00m
                method,#x1B[90m#x1B[39;49;00m
                url,#x1B[90m#x1B[39;49;00m
                timeout=timeout_obj,#x1B[90m#x1B[39;49;00m
                body=body,#x1B[90m#x1B[39;49;00m
                headers=headers,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

_is_ssl_error_message_from_http_proxy = <function HTTPConnectionPool.urlopen.<locals>._is_ssl_error_message_from_http_proxy at 0x7f0758a18e00>
assert_same_host = False
body       = None
body_pos   = None
chunked    = False
clean_exit = False
conn       = None
destination_scheme = None
err        = None
headers    = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
http_tunnel_required = False
is_new_proxy_conn = False
method     = 'GET'
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/env', query=None, fragment=None)
pool_timeout = None
redirect   = False
release_conn = False
release_this_conn = True
response_kw = {'decode_content': False, 'preload_content': False}
retries    = Retry(total=0, connect=None, read=False, redirect=None, status=None)
self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
timeout    = Timeout(connect=0.1, read=0.1, total=None)
timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
url        = '/env'

#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:715: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:404: in _make_request
    #x1B[0m#x1B[96mself#x1B[39;49;00m._validate_conn(conn)#x1B[90m#x1B[39;49;00m
        chunked    = False
        conn       = <urllib3.connection.HTTPSConnection object at 0x7f075854ea90>
        httplib_request_kw = {'body': None, 'headers': {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}}
        method     = 'GET'
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
        timeout    = Timeout(connect=0.1, read=0.1, total=None)
        timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
        url        = '/env'
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:1058: in _validate_conn
    #x1B[0mconn.connect()#x1B[90m#x1B[39;49;00m
        __class__  = <class 'urllib3.connectionpool.HTTPSConnectionPool'>
        conn       = <urllib3.connection.HTTPSConnection object at 0x7f075854ea90>
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
#x1B[1m#x1B[31m..../py/lib/python3.11.../site-packages/urllib3/connection.py#x1B[0m:419: in connect
    #x1B[0m#x1B[96mself#x1B[39;49;00m.sock = ssl_wrap_socket(#x1B[90m#x1B[39;49;00m
        conn       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        context    = <ssl.SSLContext object at 0x7f0758a0a060>
        default_ssl_context = True
        hostname   = '127.0.0.1'
        is_time_off = False
        self       = <urllib3.connection.HTTPSConnection object at 0x7f075854ea90>
        server_hostname = '127.0.0.1'
        tls_in_tls = False
#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/ssl_.py#x1B[0m:453: in ssl_wrap_socket
    #x1B[0mssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)#x1B[90m#x1B[39;49;00m
        ca_cert_data = None
        ca_cert_dir = None
        ca_certs   = '/tmp/tmpvv9e9wn_.pem'
        cert_reqs  = None
        certfile   = '/tmp/tmpmehlkoza.pem'
        ciphers    = None
        context    = <ssl.SSLContext object at 0x7f0758a0a060>
        key_password = None
        keyfile    = None
        send_sni   = False
        server_hostname = '127.0.0.1'
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        ssl_context = <ssl.SSLContext object at 0x7f0758a0a060>
        ssl_version = None
        tls_in_tls = False
        use_sni_hostname = False
#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/ssl_.py#x1B[0m:495: in _ssl_wrap_socket_impl
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m ssl_context.wrap_socket(sock)#x1B[90m#x1B[39;49;00m
        server_hostname = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        ssl_context = <ssl.SSLContext object at 0x7f0758a0a060>
        tls_in_tls = False
#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:517: in wrap_socket
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.sslsocket_class._create(#x1B[90m#x1B[39;49;00m
        do_handshake_on_connect = True
        self       = <ssl.SSLContext object at 0x7f0758a0a060>
        server_hostname = None
        server_side = False
        session    = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        suppress_ragged_eofs = True
#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:1104: in _create
    #x1B[0m#x1B[96mself#x1B[39;49;00m.do_handshake()#x1B[90m#x1B[39;49;00m
        __class__  = <class 'ssl.SSLSocket'>
        cls        = <class 'ssl.SSLSocket'>
        connected  = True
        context    = <ssl.SSLContext object at 0x7f0758a0a060>
        do_handshake_on_connect = True
        kwargs     = {'family': <AddressFamily.AF_INET: 2>, 'fileno': 19, 'proto': 6, 'type': <SocketKind.SOCK_STREAM: 1>}
        self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>
        server_hostname = None
        server_side = False
        session    = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        sock_timeout = 0.1
        suppress_ragged_eofs = True
        timeout    = 0.1
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>, block = False

    #x1B[0m#x1B[37m@_sslcopydoc#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m #x1B[92mdo_handshake#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m, block=#x1B[94mFalse#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m._check_connected()#x1B[90m#x1B[39;49;00m
        timeout = #x1B[96mself#x1B[39;49;00m.gettimeout()#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m timeout == #x1B[94m0.0#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m block:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.settimeout(#x1B[94mNone#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.SSLEOFError: [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)#x1B[0m

block      = False
self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>
timeout    = 0.1

#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:1382: SSLEOFError

#x1B[33mDuring handling of the above exception, another exception occurred:#x1B[0m

self = <requests.adapters.HTTPAdapter object at 0x7f07585b6610>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=0.1, read=0.1, total=None)
verify = '/tmp/tmpvv9e9wn_.pem', cert = '/tmp/tmpmehlkoza.pem'
proxies = OrderedDict()

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92msend#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m, request, stream=#x1B[94mFalse#x1B[39;49;00m, timeout=#x1B[94mNone#x1B[39;49;00m, verify=#x1B[94mTrue#x1B[39;49;00m, cert=#x1B[94mNone#x1B[39;49;00m, proxies=#x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Sends PreparedRequest object. Returns Response object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.#x1B[39;49;00m
    #x1B[33m    :param stream: (optional) Whether to stream the request content.#x1B[39;49;00m
    #x1B[33m    :param timeout: (optional) How long to wait for the server to send#x1B[39;49;00m
    #x1B[33m        data before giving up, as a float, or a :ref:`(connect timeout,#x1B[39;49;00m
    #x1B[33m        read timeout) <timeouts>` tuple.#x1B[39;49;00m
    #x1B[33m    :type timeout: float or tuple or urllib3 Timeout object#x1B[39;49;00m
    #x1B[33m    :param verify: (optional) Either a boolean, in which case it controls whether#x1B[39;49;00m
    #x1B[33m        we verify the server's TLS certificate, or a string, in which case it#x1B[39;49;00m
    #x1B[33m        must be a path to a CA bundle to use#x1B[39;49;00m
    #x1B[33m    :param cert: (optional) Any user-provided SSL certificate to be trusted.#x1B[39;49;00m
    #x1B[33m    :param proxies: (optional) The proxies dictionary to apply to the request.#x1B[39;49;00m
    #x1B[33m    :rtype: requests.Response#x1B[39;49;00m
    #x1B[33m    """#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
            conn = #x1B[96mself#x1B[39;49;00m.get_connection(request.url, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m LocationValueError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m InvalidURL(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.cert_verify(conn, request.url, verify, cert)#x1B[90m#x1B[39;49;00m
        url = #x1B[96mself#x1B[39;49;00m.request_url(request, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.add_headers(#x1B[90m#x1B[39;49;00m
            request,#x1B[90m#x1B[39;49;00m
            stream=stream,#x1B[90m#x1B[39;49;00m
            timeout=timeout,#x1B[90m#x1B[39;49;00m
            verify=verify,#x1B[90m#x1B[39;49;00m
            cert=cert,#x1B[90m#x1B[39;49;00m
            proxies=proxies,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        chunked = #x1B[95mnot#x1B[39;49;00m (request.body #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mContent-Length#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95min#x1B[39;49;00m request.headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, #x1B[96mtuple#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect, read = timeout#x1B[90m#x1B[39;49;00m
                timeout = TimeoutSauce(connect=connect, read=read)#x1B[90m#x1B[39;49;00m
            #x1B[94mexcept#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mInvalid timeout #x1B[39;49;00m#x1B[33m{#x1B[39;49;00mtimeout#x1B[33m}#x1B[39;49;00m#x1B[33m. Pass a (connect, read) timeout tuple, #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mor a single float to set both timeouts to the same value.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, TimeoutSauce):#x1B[90m#x1B[39;49;00m
            #x1B[94mpass#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            timeout = TimeoutSauce(connect=timeout, read=timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           resp = conn.urlopen(#x1B[90m#x1B[39;49;00m
                method=request.method,#x1B[90m#x1B[39;49;00m
                url=url,#x1B[90m#x1B[39;49;00m
                body=request.body,#x1B[90m#x1B[39;49;00m
                headers=request.headers,#x1B[90m#x1B[39;49;00m
                redirect=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                assert_same_host=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                preload_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                decode_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                retries=#x1B[96mself#x1B[39;49;00m.max_retries,#x1B[90m#x1B[39;49;00m
                timeout=timeout,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

cert       = '/tmp/tmpmehlkoza.pem'
chunked    = False
conn       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
proxies    = OrderedDict()
request    = <PreparedRequest [GET]>
self       = <requests.adapters.HTTPAdapter object at 0x7f07585b6610>
stream     = False
timeout    = Timeout(connect=0.1, read=0.1, total=None)
url        = '/env'
verify     = '/tmp/tmpvv9e9wn_.pem'

#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/adapters.py#x1B[0m:486: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:799: in urlopen
    #x1B[0mretries = retries.increment(#x1B[90m#x1B[39;49;00m
        _is_ssl_error_message_from_http_proxy = <function HTTPConnectionPool.urlopen.<locals>._is_ssl_error_message_from_http_proxy at 0x7f0758a18e00>
        assert_same_host = False
        body       = None
        body_pos   = None
        chunked    = False
        clean_exit = False
        conn       = None
        destination_scheme = None
        err        = None
        headers    = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
        http_tunnel_required = False
        is_new_proxy_conn = False
        method     = 'GET'
        parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/env', query=None, fragment=None)
        pool_timeout = None
        redirect   = False
        release_conn = False
        release_this_conn = True
        response_kw = {'decode_content': False, 'preload_content': False}
        retries    = Retry(total=0, connect=None, read=False, redirect=None, status=None)
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
        timeout    = Timeout(connect=0.1, read=0.1, total=None)
        timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
        url        = '/env'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
method = 'GET', url = '/env', response = None
error = SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))
_pool = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
_stacktrace = <traceback object at 0x7f075854f1c0>

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92mincrement#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        method=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        url=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        response=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        error=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        _pool=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        _stacktrace=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Return a new Retry object with incremented retry counters.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param response: A response object, or None, if the server did not#x1B[39;49;00m
    #x1B[33m        return a response.#x1B[39;49;00m
    #x1B[33m    :type response: :class:`~urllib3.response.HTTPResponse`#x1B[39;49;00m
    #x1B[33m    :param Exception error: An error encountered during the request, or#x1B[39;49;00m
    #x1B[33m        None if the response was received successfully.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :return: A new ``Retry`` object.#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.total #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m error:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Disabled, indicate to re-raise the error.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        total = #x1B[96mself#x1B[39;49;00m.total#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m total #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            total -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        connect = #x1B[96mself#x1B[39;49;00m.connect#x1B[90m#x1B[39;49;00m
        read = #x1B[96mself#x1B[39;49;00m.read#x1B[90m#x1B[39;49;00m
        redirect = #x1B[96mself#x1B[39;49;00m.redirect#x1B[90m#x1B[39;49;00m
        status_count = #x1B[96mself#x1B[39;49;00m.status#x1B[90m#x1B[39;49;00m
        other = #x1B[96mself#x1B[39;49;00m.other#x1B[90m#x1B[39;49;00m
        cause = #x1B[33m"#x1B[39;49;00m#x1B[33munknown#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        status = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        redirect_location = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m error #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_connection_error(error):#x1B[90m#x1B[39;49;00m
            #x1B[90m# Connect retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m connect #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m connect #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m error #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_read_error(error):#x1B[90m#x1B[39;49;00m
            #x1B[90m# Read retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m read #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_method_retryable(method):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m read #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                read -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m error:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Other retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m other #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                other -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m response #x1B[95mand#x1B[39;49;00m response.get_redirect_location():#x1B[90m#x1B[39;49;00m
            #x1B[90m# Redirect retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m redirect #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                redirect -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            cause = #x1B[33m"#x1B[39;49;00m#x1B[33mtoo many redirects#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            redirect_location = response.get_redirect_location()#x1B[90m#x1B[39;49;00m
            status = response.status#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Incrementing because of a server error like a 500 in#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[90m# status_forcelist and the given method is in the allowed_methods#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            cause = ResponseError.GENERIC_ERROR#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m response #x1B[95mand#x1B[39;49;00m response.status:#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m status_count #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    status_count -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)#x1B[90m#x1B[39;49;00m
                status = response.status#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        history = #x1B[96mself#x1B[39;49;00m.history + (#x1B[90m#x1B[39;49;00m
            RequestHistory(method, url, error, status, redirect_location),#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        new_retry = #x1B[96mself#x1B[39;49;00m.new(#x1B[90m#x1B[39;49;00m
            total=total,#x1B[90m#x1B[39;49;00m
            connect=connect,#x1B[90m#x1B[39;49;00m
            read=read,#x1B[90m#x1B[39;49;00m
            redirect=redirect,#x1B[90m#x1B[39;49;00m
            status=status_count,#x1B[90m#x1B[39;49;00m
            other=other,#x1B[90m#x1B[39;49;00m
            history=history,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m new_retry.is_exhausted():#x1B[90m#x1B[39;49;00m
>           #x1B[94mraise#x1B[39;49;00m MaxRetryError(_pool, url, error #x1B[95mor#x1B[39;49;00m ResponseError(cause))#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE           urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='127.0.0.1', port=33199): Max retries exceeded with url: /env (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')))#x1B[0m

_pool      = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
_stacktrace = <traceback object at 0x7f075854f1c0>
cause      = 'unknown'
connect    = None
error      = SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))
history    = (RequestHistory(method='GET', url='/env', error=SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')), status=None, redirect_location=None),)
method     = 'GET'
new_retry  = Retry(total=-1, connect=None, read=False, redirect=None, status=None)
other      = None
read       = False
redirect   = None
redirect_location = None
response   = None
self       = Retry(total=0, connect=None, read=False, redirect=None, status=None)
status     = None
status_count = None
total      = -1
url        = '/env'

#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/retry.py#x1B[0m:592: MaxRetryError

#x1B[33mDuring handling of the above exception, another exception occurred:#x1B[0m

thread_exceptions = [], recwarn = WarningsRecorder(record=True)
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f07585b5150>
http_request_timeout = 0.1
tls_http_server = functools.partial(<function make_tls_http_server at 0x7f075b7c8cc0>, request=<SubRequest 'tls_http_server' for <Function test_ssl_env[2-True-builtin]>>)
adapter_type = 'builtin', ca = <trustme.CA object at 0x7f07585b5750>
tls_verify_mode = <VerifyMode.CERT_REQUIRED: 2>
tls_certificate = <trustme.LeafCert object at 0x7f07585b7b90>
tls_certificate_chain_pem_path = '/tmp/tmpbscjvlik.pem'
tls_certificate_private_key_pem_path = '/tmp/tmpvs8680f_.pem'
tls_ca_certificate_pem_path = '/tmp/tmpvv9e9wn_.pem', use_client_cert = True

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(  #x1B[90m# noqa: C901  # FIXME#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[33m'#x1B[39;49;00m#x1B[33madapter_type#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            pytest.param(#x1B[90m#x1B[39;49;00m
                #x1B[33m'#x1B[39;49;00m#x1B[33mbuiltin#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                marks=pytest.mark.xfail(#x1B[90m#x1B[39;49;00m
                    IS_MACOS #x1B[95mand#x1B[39;49;00m PY310_PLUS,#x1B[90m#x1B[39;49;00m
                    reason=#x1B[33m'#x1B[39;49;00m#x1B[33mUnclosed TLS resource warnings happen on macOS #x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33m'#x1B[39;49;00m#x1B[33munder Python 3.10 (#508)#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                    strict=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                ),#x1B[90m#x1B[39;49;00m
            ),#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33mpyopenssl#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[90m#x1B[39;49;00m
        (#x1B[33m'#x1B[39;49;00m#x1B[33mtls_verify_mode#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33muse_client_cert#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            (ssl.CERT_NONE, #x1B[94mFalse#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_NONE, #x1B[94mTrue#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_OPTIONAL, #x1B[94mFalse#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_OPTIONAL, #x1B[94mTrue#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (ssl.CERT_REQUIRED, #x1B[94mTrue#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m #x1B[92mtest_ssl_env#x1B[39;49;00m(  #x1B[90m# noqa: C901  # FIXME#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        thread_exceptions,#x1B[90m#x1B[39;49;00m
        recwarn,#x1B[90m#x1B[39;49;00m
        mocker,#x1B[90m#x1B[39;49;00m
        http_request_timeout,#x1B[90m#x1B[39;49;00m
        tls_http_server,#x1B[90m#x1B[39;49;00m
        adapter_type,#x1B[90m#x1B[39;49;00m
        ca,#x1B[90m#x1B[39;49;00m
        tls_verify_mode,#x1B[90m#x1B[39;49;00m
        tls_certificate,#x1B[90m#x1B[39;49;00m
        tls_certificate_chain_pem_path,#x1B[90m#x1B[39;49;00m
        tls_certificate_private_key_pem_path,#x1B[90m#x1B[39;49;00m
        tls_ca_certificate_pem_path,#x1B[90m#x1B[39;49;00m
        use_client_cert,#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Test the SSL environment generated by the SSL adapters."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        interface, _host, port = _get_conn_data(ANY_INTERFACE_IPV4)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mwith#x1B[39;49;00m mocker.mock_module.patch(#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33midna.core.ulabel#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            return_value=ntob(#x1B[33m'#x1B[39;49;00m#x1B[33m127.0.0.1#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        ):#x1B[90m#x1B[39;49;00m
            client_cert = ca.issue_cert(ntou(#x1B[33m'#x1B[39;49;00m#x1B[33m127.0.0.1#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mwith#x1B[39;49;00m client_cert.private_key_and_cert_chain_pem.tempfile() #x1B[94mas#x1B[39;49;00m cl_pem:#x1B[90m#x1B[39;49;00m
            tls_adapter_cls = get_ssl_adapter_class(name=adapter_type)#x1B[90m#x1B[39;49;00m
            tls_adapter = tls_adapter_cls(#x1B[90m#x1B[39;49;00m
                tls_certificate_chain_pem_path,#x1B[90m#x1B[39;49;00m
                tls_certificate_private_key_pem_path,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m adapter_type == #x1B[33m'#x1B[39;49;00m#x1B[33mpyopenssl#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                tls_adapter.context = tls_adapter.get_context()#x1B[90m#x1B[39;49;00m
                tls_adapter.context.set_verify(#x1B[90m#x1B[39;49;00m
                    _stdlib_to_openssl_verify[tls_verify_mode],#x1B[90m#x1B[39;49;00m
                    #x1B[94mlambda#x1B[39;49;00m conn, cert, errno, depth, preverify_ok: preverify_ok,#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_adapter.context.verify_mode = tls_verify_mode#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            ca.configure_trust(tls_adapter.context)#x1B[90m#x1B[39;49;00m
            tls_certificate.configure_cert(tls_adapter.context)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            tlswsgiserver = tls_http_server((interface, port), tls_adapter)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            interface, _host, port = _get_conn_data(tlswsgiserver.bind_addr)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>           resp = requests.get(#x1B[90m#x1B[39;49;00m
                #x1B[33m'#x1B[39;49;00m#x1B[33mhttps://#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m + interface + #x1B[33m'#x1B[39;49;00m#x1B[33m:#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m + #x1B[96mstr#x1B[39;49;00m(port) + #x1B[33m'#x1B[39;49;00m#x1B[33m/env#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                timeout=http_request_timeout,#x1B[90m#x1B[39;49;00m
                verify=tls_ca_certificate_pem_path,#x1B[90m#x1B[39;49;00m
                cert=cl_pem #x1B[94mif#x1B[39;49;00m use_client_cert #x1B[94melse#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

_host      = '127.0.0.1'
adapter_type = 'builtin'
ca         = <trustme.CA object at 0x7f07585b5750>
cl_pem     = '/tmp/tmpmehlkoza.pem'
client_cert = <trustme.LeafCert object at 0x7f075854c390>
http_request_timeout = 0.1
interface  = '127.0.0.1'
mocker     = <pytest_mock.plugin.MockerFixture object at 0x7f07585b5150>
port       = 33199
recwarn    = WarningsRecorder(record=True)
thread_exceptions = []
tls_adapter = <cheroot.ssl.builtin.BuiltinSSLAdapter object at 0x7f07585b6190>
tls_adapter_cls = <class 'cheroot.ssl.builtin.BuiltinSSLAdapter'>
tls_ca_certificate_pem_path = '/tmp/tmpvv9e9wn_.pem'
tls_certificate = <trustme.LeafCert object at 0x7f07585b7b90>
tls_certificate_chain_pem_path = '/tmp/tmpbscjvlik.pem'
tls_certificate_private_key_pem_path = '/tmp/tmpvs8680f_.pem'
tls_http_server = functools.partial(<function make_tls_http_server at 0x7f075b7c8cc0>, request=<SubRequest 'tls_http_server' for <Function test_ssl_env[2-True-builtin]>>)
tls_verify_mode = <VerifyMode.CERT_REQUIRED: 2>
tlswsgiserver = <cheroot.server.HTTPServer object at 0x7f075854c0d0>
use_client_cert = True

#x1B[1m#x1B[31mcheroot/test/test_ssl.py#x1B[0m:530: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/api.py#x1B[0m:73: in get
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m request(#x1B[33m"#x1B[39;49;00m#x1B[33mget#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, url, params=params, **kwargs)#x1B[90m#x1B[39;49;00m
        kwargs     = {'cert': '/tmp/tmpmehlkoza.pem', 'timeout': 0.1, 'verify': '/tmp/tmpvv9e9wn_.pem'}
        params     = None
        url        = 'https://127.0.0.1:33199/env'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/api.py#x1B[0m:59: in request
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m session.request(method=method, url=url, **kwargs)#x1B[90m#x1B[39;49;00m
        kwargs     = {'cert': '/tmp/tmpmehlkoza.pem', 'params': None, 'timeout': 0.1, 'verify': '/tmp/tmpvv9e9wn_.pem'}
        method     = 'get'
        session    = <requests.sessions.Session object at 0x7f07585b7e90>
        url        = 'https://127.0.0.1:33199/env'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/sessions.py#x1B[0m:589: in request
    #x1B[0mresp = #x1B[96mself#x1B[39;49;00m.send(prep, **send_kwargs)#x1B[90m#x1B[39;49;00m
        allow_redirects = True
        auth       = None
        cert       = '/tmp/tmpmehlkoza.pem'
        cookies    = None
        data       = None
        files      = None
        headers    = None
        hooks      = None
        json       = None
        method     = 'get'
        params     = None
        prep       = <PreparedRequest [GET]>
        proxies    = {}
        req        = <Request [GET]>
        self       = <requests.sessions.Session object at 0x7f07585b7e90>
        send_kwargs = {'allow_redirects': True, 'cert': '/tmp/tmpmehlkoza.pem', 'proxies': OrderedDict(), 'stream': False, ...}
        settings   = {'cert': '/tmp/tmpmehlkoza.pem', 'proxies': OrderedDict(), 'stream': False, 'verify': '/tmp/tmpvv9e9wn_.pem'}
        stream     = None
        timeout    = 0.1
        url        = 'https://127.0.0.1:33199/env'
        verify     = '/tmp/tmpvv9e9wn_.pem'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/sessions.py#x1B[0m:703: in send
    #x1B[0mr = adapter.send(request, **kwargs)#x1B[90m#x1B[39;49;00m
        adapter    = <requests.adapters.HTTPAdapter object at 0x7f07585b6610>
        allow_redirects = True
        hooks      = {'response': []}
        kwargs     = {'cert': '/tmp/tmpmehlkoza.pem', 'proxies': OrderedDict(), 'stream': False, 'timeout': 0.1, ...}
        request    = <PreparedRequest [GET]>
        self       = <requests.sessions.Session object at 0x7f07585b7e90>
        start      = 1750666741.136243
        stream     = False
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7f07585b6610>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=0.1, read=0.1, total=None)
verify = '/tmp/tmpvv9e9wn_.pem', cert = '/tmp/tmpmehlkoza.pem'
proxies = OrderedDict()

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92msend#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m, request, stream=#x1B[94mFalse#x1B[39;49;00m, timeout=#x1B[94mNone#x1B[39;49;00m, verify=#x1B[94mTrue#x1B[39;49;00m, cert=#x1B[94mNone#x1B[39;49;00m, proxies=#x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Sends PreparedRequest object. Returns Response object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.#x1B[39;49;00m
    #x1B[33m    :param stream: (optional) Whether to stream the request content.#x1B[39;49;00m
    #x1B[33m    :param timeout: (optional) How long to wait for the server to send#x1B[39;49;00m
    #x1B[33m        data before giving up, as a float, or a :ref:`(connect timeout,#x1B[39;49;00m
    #x1B[33m        read timeout) <timeouts>` tuple.#x1B[39;49;00m
    #x1B[33m    :type timeout: float or tuple or urllib3 Timeout object#x1B[39;49;00m
    #x1B[33m    :param verify: (optional) Either a boolean, in which case it controls whether#x1B[39;49;00m
    #x1B[33m        we verify the server's TLS certificate, or a string, in which case it#x1B[39;49;00m
    #x1B[33m        must be a path to a CA bundle to use#x1B[39;49;00m
    #x1B[33m    :param cert: (optional) Any user-provided SSL certificate to be trusted.#x1B[39;49;00m
    #x1B[33m    :param proxies: (optional) The proxies dictionary to apply to the request.#x1B[39;49;00m
    #x1B[33m    :rtype: requests.Response#x1B[39;49;00m
    #x1B[33m    """#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
            conn = #x1B[96mself#x1B[39;49;00m.get_connection(request.url, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m LocationValueError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m InvalidURL(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.cert_verify(conn, request.url, verify, cert)#x1B[90m#x1B[39;49;00m
        url = #x1B[96mself#x1B[39;49;00m.request_url(request, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.add_headers(#x1B[90m#x1B[39;49;00m
            request,#x1B[90m#x1B[39;49;00m
            stream=stream,#x1B[90m#x1B[39;49;00m
            timeout=timeout,#x1B[90m#x1B[39;49;00m
            verify=verify,#x1B[90m#x1B[39;49;00m
            cert=cert,#x1B[90m#x1B[39;49;00m
            proxies=proxies,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        chunked = #x1B[95mnot#x1B[39;49;00m (request.body #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mContent-Length#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95min#x1B[39;49;00m request.headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, #x1B[96mtuple#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect, read = timeout#x1B[90m#x1B[39;49;00m
                timeout = TimeoutSauce(connect=connect, read=read)#x1B[90m#x1B[39;49;00m
            #x1B[94mexcept#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mInvalid timeout #x1B[39;49;00m#x1B[33m{#x1B[39;49;00mtimeout#x1B[33m}#x1B[39;49;00m#x1B[33m. Pass a (connect, read) timeout tuple, #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mor a single float to set both timeouts to the same value.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, TimeoutSauce):#x1B[90m#x1B[39;49;00m
            #x1B[94mpass#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            timeout = TimeoutSauce(connect=timeout, read=timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            resp = conn.urlopen(#x1B[90m#x1B[39;49;00m
                method=request.method,#x1B[90m#x1B[39;49;00m
                url=url,#x1B[90m#x1B[39;49;00m
                body=request.body,#x1B[90m#x1B[39;49;00m
                headers=request.headers,#x1B[90m#x1B[39;49;00m
                redirect=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                assert_same_host=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                preload_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                decode_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                retries=#x1B[96mself#x1B[39;49;00m.max_retries,#x1B[90m#x1B[39;49;00m
                timeout=timeout,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m (ProtocolError, #x1B[96mOSError#x1B[39;49;00m) #x1B[94mas#x1B[39;49;00m err:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m #x1B[96mConnectionError#x1B[39;49;00m(err, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m MaxRetryError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, ConnectTimeoutError):#x1B[90m#x1B[39;49;00m
                #x1B[90m# TODO: Remove this in 3.0.0: see #2811#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, NewConnectionError):#x1B[90m#x1B[39;49;00m
                    #x1B[94mraise#x1B[39;49;00m ConnectTimeout(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, ResponseError):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m RetryError(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, _ProxyError):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m ProxyError(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, _SSLError):#x1B[90m#x1B[39;49;00m
                #x1B[90m# This branch is for urllib3 v1.22 and later.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>               #x1B[94mraise#x1B[39;49;00m SSLError(e, request=request)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               requests.exceptions.SSLError: HTTPSConnectionPool(host='127.0.0.1', port=33199): Max retries exceeded with url: /env (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')))#x1B[0m

cert       = '/tmp/tmpmehlkoza.pem'
chunked    = False
conn       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f075854ee50>
proxies    = OrderedDict()
request    = <PreparedRequest [GET]>
self       = <requests.adapters.HTTPAdapter object at 0x7f07585b6610>
stream     = False
timeout    = Timeout(connect=0.1, read=0.1, total=None)
url        = '/env'
verify     = '/tmp/tmpvv9e9wn_.pem'

#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/adapters.py#x1B[0m:517: SSLError
cheroot.test.test_ssl::test_tls_client_auth[1-True-*.localhost-builtin]
Stack Traces | 0.109s run time
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
method = 'GET', url = '/', body = None
headers = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=0.1, read=0.1, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None
response_kw = {'decode_content': False, 'preload_content': False}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/', query=None, fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92murlopen#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        method,#x1B[90m#x1B[39;49;00m
        url,#x1B[90m#x1B[39;49;00m
        body=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        headers=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        retries=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        redirect=#x1B[94mTrue#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        assert_same_host=#x1B[94mTrue#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        timeout=_Default,#x1B[90m#x1B[39;49;00m
        pool_timeout=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        release_conn=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        chunked=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        body_pos=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        **response_kw#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""#x1B[39;49;00m
    #x1B[33m    Get a connection from the pool and perform an HTTP request. This is the#x1B[39;49;00m
    #x1B[33m    lowest level call for making a request, so you'll need to specify all#x1B[39;49;00m
    #x1B[33m    the raw details.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    .. note::#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m       More commonly, it's appropriate to use a convenience method provided#x1B[39;49;00m
    #x1B[33m       by :class:`.RequestMethods`, such as :meth:`request`.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    .. note::#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m       `release_conn` will only behave as expected if#x1B[39;49;00m
    #x1B[33m       `preload_content=False` because we want to make#x1B[39;49;00m
    #x1B[33m       `preload_content=False` the default behaviour someday soon without#x1B[39;49;00m
    #x1B[33m       breaking backwards compatibility.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param method:#x1B[39;49;00m
    #x1B[33m        HTTP request method (such as GET, POST, PUT, etc.)#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param url:#x1B[39;49;00m
    #x1B[33m        The URL to perform the request on.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param body:#x1B[39;49;00m
    #x1B[33m        Data to send in the request body, either :class:`str`, :class:`bytes`,#x1B[39;49;00m
    #x1B[33m        an iterable of :class:`str`/:class:`bytes`, or a file-like object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param headers:#x1B[39;49;00m
    #x1B[33m        Dictionary of custom headers to send, such as User-Agent,#x1B[39;49;00m
    #x1B[33m        If-None-Match, etc. If None, pool headers are used. If provided,#x1B[39;49;00m
    #x1B[33m        these headers completely replace any pool-specific headers.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param retries:#x1B[39;49;00m
    #x1B[33m        Configure the number of retries to allow before raising a#x1B[39;49;00m
    #x1B[33m        :class:`~urllib3.exceptions.MaxRetryError` exception.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m        Pass ``None`` to retry until you receive a response. Pass a#x1B[39;49;00m
    #x1B[33m        :class:`~urllib3.util.retry.Retry` object for fine-grained control#x1B[39;49;00m
    #x1B[33m        over different types of retries.#x1B[39;49;00m
    #x1B[33m        Pass an integer number to retry connection errors that many times,#x1B[39;49;00m
    #x1B[33m        but no other types of errors. Pass zero to never retry.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m        If ``False``, then retries are disabled and any exception is raised#x1B[39;49;00m
    #x1B[33m        immediately. Also, instead of raising a MaxRetryError on redirects,#x1B[39;49;00m
    #x1B[33m        the redirect response will be returned.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param redirect:#x1B[39;49;00m
    #x1B[33m        If True, automatically handle redirects (status codes 301, 302,#x1B[39;49;00m
    #x1B[33m        303, 307, 308). Each redirect counts as a retry. Disabling retries#x1B[39;49;00m
    #x1B[33m        will disable redirect, too.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param assert_same_host:#x1B[39;49;00m
    #x1B[33m        If ``True``, will make sure that the host of the pool requests is#x1B[39;49;00m
    #x1B[33m        consistent else will raise HostChangedError. When ``False``, you can#x1B[39;49;00m
    #x1B[33m        use the pool on an HTTP proxy and request foreign hosts.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param timeout:#x1B[39;49;00m
    #x1B[33m        If specified, overrides the default timeout for this one#x1B[39;49;00m
    #x1B[33m        request. It may be a float (in seconds) or an instance of#x1B[39;49;00m
    #x1B[33m        :class:`urllib3.util.Timeout`.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param pool_timeout:#x1B[39;49;00m
    #x1B[33m        If set and the pool is set to block=True, then this method will#x1B[39;49;00m
    #x1B[33m        block for ``pool_timeout`` seconds and raise EmptyPoolError if no#x1B[39;49;00m
    #x1B[33m        connection is available within the time period.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param release_conn:#x1B[39;49;00m
    #x1B[33m        If False, then the urlopen call will not release the connection#x1B[39;49;00m
    #x1B[33m        back into the pool once a response is received (but will release if#x1B[39;49;00m
    #x1B[33m        you read the entire contents of the response such as when#x1B[39;49;00m
    #x1B[33m        `preload_content=True`). This is useful if you're not preloading#x1B[39;49;00m
    #x1B[33m        the response's content immediately. You will need to call#x1B[39;49;00m
    #x1B[33m        ``r.release_conn()`` on the response ``r`` to return the connection#x1B[39;49;00m
    #x1B[33m        back into the pool. If None, it takes the value of#x1B[39;49;00m
    #x1B[33m        ``response_kw.get('preload_content', True)``.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param chunked:#x1B[39;49;00m
    #x1B[33m        If True, urllib3 will send the body using chunked transfer#x1B[39;49;00m
    #x1B[33m        encoding. Otherwise, urllib3 will send the body using the standard#x1B[39;49;00m
    #x1B[33m        content-length form. Defaults to False.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param int body_pos:#x1B[39;49;00m
    #x1B[33m        Position to seek to in file-like body in the event of a retry or#x1B[39;49;00m
    #x1B[33m        redirect. Typically this won't need to be set because urllib3 will#x1B[39;49;00m
    #x1B[33m        auto-populate the value when needed.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param \\**response_kw:#x1B[39;49;00m
    #x1B[33m        Additional parameters are passed to#x1B[39;49;00m
    #x1B[33m        :meth:`urllib3.response.HTTPResponse.from_httplib`#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        parsed_url = parse_url(url)#x1B[90m#x1B[39;49;00m
        destination_scheme = parsed_url.scheme#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m headers #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            headers = #x1B[96mself#x1B[39;49;00m.headers#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(retries, Retry):#x1B[90m#x1B[39;49;00m
            retries = Retry.from_int(retries, redirect=redirect, default=#x1B[96mself#x1B[39;49;00m.retries)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m release_conn #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            release_conn = response_kw.get(#x1B[33m"#x1B[39;49;00m#x1B[33mpreload_content#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94mTrue#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Check host#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m assert_same_host #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.is_same_host(url):#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m HostChangedError(#x1B[96mself#x1B[39;49;00m, url, retries)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Ensure that the URL we're connecting to is properly encoded#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m url.startswith(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            url = six.ensure_str(_encode_target(url))#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            url = six.ensure_str(parsed_url.url)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        conn = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Track whether `conn` needs to be released before#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# returning/raising/recursing. Update this variable if necessary, and#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# leave `release_conn` constant throughout the function. That way, if#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# the function recurses, the original value of `release_conn` will be#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# passed down into the recursive call, and its value will be respected.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m##x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# See issue #651 [1] for details.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m##x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# [1] <https://github..../urllib3/issues/651>#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        release_this_conn = release_conn#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        http_tunnel_required = connection_requires_http_tunnel(#x1B[90m#x1B[39;49;00m
            #x1B[96mself#x1B[39;49;00m.proxy, #x1B[96mself#x1B[39;49;00m.proxy_config, destination_scheme#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Merge the proxy headers. Only done when not using HTTP CONNECT. We#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# have to copy the headers dict so we can safely change it without those#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# changes being reflected in anyone else's copy.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m http_tunnel_required:#x1B[90m#x1B[39;49;00m
            headers = headers.copy()#x1B[90m#x1B[39;49;00m
            headers.update(#x1B[96mself#x1B[39;49;00m.proxy_headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Must keep the exception bound to a separate variable or else Python 3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# complains about UnboundLocalError.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        err = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Keep track of whether we cleanly exited the except block. This#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# ensures we do proper cleanup in finally.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        clean_exit = #x1B[94mFalse#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# Rewind body position, if needed. Record current position#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# for future rewinds in the event of a redirect/retry.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        body_pos = set_file_position(body, body_pos)#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# Request a connection from the queue.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            timeout_obj = #x1B[96mself#x1B[39;49;00m._get_timeout(timeout)#x1B[90m#x1B[39;49;00m
            conn = #x1B[96mself#x1B[39;49;00m._get_conn(timeout=pool_timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            conn.timeout = timeout_obj.connect_timeout#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            is_new_proxy_conn = #x1B[96mself#x1B[39;49;00m.proxy #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mgetattr#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                conn, #x1B[33m"#x1B[39;49;00m#x1B[33msock#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m is_new_proxy_conn #x1B[95mand#x1B[39;49;00m http_tunnel_required:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m._prepare_proxy(conn)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[90m# Make the request on the httplib connection object.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>           httplib_response = #x1B[96mself#x1B[39;49;00m._make_request(#x1B[90m#x1B[39;49;00m
                conn,#x1B[90m#x1B[39;49;00m
                method,#x1B[90m#x1B[39;49;00m
                url,#x1B[90m#x1B[39;49;00m
                timeout=timeout_obj,#x1B[90m#x1B[39;49;00m
                body=body,#x1B[90m#x1B[39;49;00m
                headers=headers,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

_is_ssl_error_message_from_http_proxy = <function HTTPConnectionPool.urlopen.<locals>._is_ssl_error_message_from_http_proxy at 0x7fcc94d5e7a0>
assert_same_host = False
body       = None
body_pos   = None
chunked    = False
clean_exit = False
conn       = None
destination_scheme = None
err        = None
headers    = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
http_tunnel_required = False
is_new_proxy_conn = False
method     = 'GET'
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/', query=None, fragment=None)
pool_timeout = None
redirect   = False
release_conn = False
release_this_conn = True
response_kw = {'decode_content': False, 'preload_content': False}
retries    = Retry(total=0, connect=None, read=False, redirect=None, status=None)
self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
timeout    = Timeout(connect=0.1, read=0.1, total=None)
timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
url        = '/'

#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:715: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:404: in _make_request
    #x1B[0m#x1B[96mself#x1B[39;49;00m._validate_conn(conn)#x1B[90m#x1B[39;49;00m
        chunked    = False
        conn       = <urllib3.connection.HTTPSConnection object at 0x7fcc94db8a10>
        httplib_request_kw = {'body': None, 'headers': {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}}
        method     = 'GET'
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
        timeout    = Timeout(connect=0.1, read=0.1, total=None)
        timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
        url        = '/'
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:1058: in _validate_conn
    #x1B[0mconn.connect()#x1B[90m#x1B[39;49;00m
        __class__  = <class 'urllib3.connectionpool.HTTPSConnectionPool'>
        conn       = <urllib3.connection.HTTPSConnection object at 0x7fcc94db8a10>
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
#x1B[1m#x1B[31m..../py/lib/python3.11.../site-packages/urllib3/connection.py#x1B[0m:419: in connect
    #x1B[0m#x1B[96mself#x1B[39;49;00m.sock = ssl_wrap_socket(#x1B[90m#x1B[39;49;00m
        conn       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        context    = <ssl.SSLContext object at 0x7fcc84fceba0>
        default_ssl_context = True
        hostname   = '127.0.0.1'
        is_time_off = False
        self       = <urllib3.connection.HTTPSConnection object at 0x7fcc94db8a10>
        server_hostname = '127.0.0.1'
        tls_in_tls = False
#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/ssl_.py#x1B[0m:453: in ssl_wrap_socket
    #x1B[0mssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)#x1B[90m#x1B[39;49;00m
        ca_cert_data = None
        ca_cert_dir = None
        ca_certs   = '/tmp/tmpzd02wbio.pem'
        cert_reqs  = None
        certfile   = '/tmp/tmpq6byec1y.pem'
        ciphers    = None
        context    = <ssl.SSLContext object at 0x7fcc84fceba0>
        key_password = None
        keyfile    = None
        send_sni   = False
        server_hostname = '127.0.0.1'
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        ssl_context = <ssl.SSLContext object at 0x7fcc84fceba0>
        ssl_version = None
        tls_in_tls = False
        use_sni_hostname = False
#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/ssl_.py#x1B[0m:495: in _ssl_wrap_socket_impl
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m ssl_context.wrap_socket(sock)#x1B[90m#x1B[39;49;00m
        server_hostname = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        ssl_context = <ssl.SSLContext object at 0x7fcc84fceba0>
        tls_in_tls = False
#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:517: in wrap_socket
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.sslsocket_class._create(#x1B[90m#x1B[39;49;00m
        do_handshake_on_connect = True
        self       = <ssl.SSLContext object at 0x7fcc84fceba0>
        server_hostname = None
        server_side = False
        session    = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        suppress_ragged_eofs = True
#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:1104: in _create
    #x1B[0m#x1B[96mself#x1B[39;49;00m.do_handshake()#x1B[90m#x1B[39;49;00m
        __class__  = <class 'ssl.SSLSocket'>
        cls        = <class 'ssl.SSLSocket'>
        connected  = True
        context    = <ssl.SSLContext object at 0x7fcc84fceba0>
        do_handshake_on_connect = True
        kwargs     = {'family': <AddressFamily.AF_INET: 2>, 'fileno': 16, 'proto': 6, 'type': <SocketKind.SOCK_STREAM: 1>}
        self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>
        server_hostname = None
        server_side = False
        session    = None
        sock       = <socket.socket [closed] fd=-1, family=2, type=1, proto=6>
        sock_timeout = 0.1
        suppress_ragged_eofs = True
        timeout    = 0.1
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>, block = False

    #x1B[0m#x1B[37m@_sslcopydoc#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m #x1B[92mdo_handshake#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m, block=#x1B[94mFalse#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m._check_connected()#x1B[90m#x1B[39;49;00m
        timeout = #x1B[96mself#x1B[39;49;00m.gettimeout()#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m timeout == #x1B[94m0.0#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m block:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.settimeout(#x1B[94mNone#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.SSLEOFError: [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)#x1B[0m

block      = False
self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=6>
timeout    = 0.1

#x1B[1m#x1B[.../hostedtoolcache/Python/3.11.12........./x64/lib/python3.11/ssl.py#x1B[0m:1382: SSLEOFError

#x1B[33mDuring handling of the above exception, another exception occurred:#x1B[0m

self = <requests.adapters.HTTPAdapter object at 0x7fcc96fc6910>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=0.1, read=0.1, total=None)
verify = '/tmp/tmpzd02wbio.pem', cert = '/tmp/tmpq6byec1y.pem'
proxies = OrderedDict()

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92msend#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m, request, stream=#x1B[94mFalse#x1B[39;49;00m, timeout=#x1B[94mNone#x1B[39;49;00m, verify=#x1B[94mTrue#x1B[39;49;00m, cert=#x1B[94mNone#x1B[39;49;00m, proxies=#x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Sends PreparedRequest object. Returns Response object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.#x1B[39;49;00m
    #x1B[33m    :param stream: (optional) Whether to stream the request content.#x1B[39;49;00m
    #x1B[33m    :param timeout: (optional) How long to wait for the server to send#x1B[39;49;00m
    #x1B[33m        data before giving up, as a float, or a :ref:`(connect timeout,#x1B[39;49;00m
    #x1B[33m        read timeout) <timeouts>` tuple.#x1B[39;49;00m
    #x1B[33m    :type timeout: float or tuple or urllib3 Timeout object#x1B[39;49;00m
    #x1B[33m    :param verify: (optional) Either a boolean, in which case it controls whether#x1B[39;49;00m
    #x1B[33m        we verify the server's TLS certificate, or a string, in which case it#x1B[39;49;00m
    #x1B[33m        must be a path to a CA bundle to use#x1B[39;49;00m
    #x1B[33m    :param cert: (optional) Any user-provided SSL certificate to be trusted.#x1B[39;49;00m
    #x1B[33m    :param proxies: (optional) The proxies dictionary to apply to the request.#x1B[39;49;00m
    #x1B[33m    :rtype: requests.Response#x1B[39;49;00m
    #x1B[33m    """#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
            conn = #x1B[96mself#x1B[39;49;00m.get_connection(request.url, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m LocationValueError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m InvalidURL(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.cert_verify(conn, request.url, verify, cert)#x1B[90m#x1B[39;49;00m
        url = #x1B[96mself#x1B[39;49;00m.request_url(request, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.add_headers(#x1B[90m#x1B[39;49;00m
            request,#x1B[90m#x1B[39;49;00m
            stream=stream,#x1B[90m#x1B[39;49;00m
            timeout=timeout,#x1B[90m#x1B[39;49;00m
            verify=verify,#x1B[90m#x1B[39;49;00m
            cert=cert,#x1B[90m#x1B[39;49;00m
            proxies=proxies,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        chunked = #x1B[95mnot#x1B[39;49;00m (request.body #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mContent-Length#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95min#x1B[39;49;00m request.headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, #x1B[96mtuple#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect, read = timeout#x1B[90m#x1B[39;49;00m
                timeout = TimeoutSauce(connect=connect, read=read)#x1B[90m#x1B[39;49;00m
            #x1B[94mexcept#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mInvalid timeout #x1B[39;49;00m#x1B[33m{#x1B[39;49;00mtimeout#x1B[33m}#x1B[39;49;00m#x1B[33m. Pass a (connect, read) timeout tuple, #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mor a single float to set both timeouts to the same value.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, TimeoutSauce):#x1B[90m#x1B[39;49;00m
            #x1B[94mpass#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            timeout = TimeoutSauce(connect=timeout, read=timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           resp = conn.urlopen(#x1B[90m#x1B[39;49;00m
                method=request.method,#x1B[90m#x1B[39;49;00m
                url=url,#x1B[90m#x1B[39;49;00m
                body=request.body,#x1B[90m#x1B[39;49;00m
                headers=request.headers,#x1B[90m#x1B[39;49;00m
                redirect=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                assert_same_host=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                preload_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                decode_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                retries=#x1B[96mself#x1B[39;49;00m.max_retries,#x1B[90m#x1B[39;49;00m
                timeout=timeout,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m

cert       = '/tmp/tmpq6byec1y.pem'
chunked    = False
conn       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
proxies    = OrderedDict()
request    = <PreparedRequest [GET]>
self       = <requests.adapters.HTTPAdapter object at 0x7fcc96fc6910>
stream     = False
timeout    = Timeout(connect=0.1, read=0.1, total=None)
url        = '/'
verify     = '/tmp/tmpzd02wbio.pem'

#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/adapters.py#x1B[0m:486: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11............/site-packages/urllib3/connectionpool.py#x1B[0m:799: in urlopen
    #x1B[0mretries = retries.increment(#x1B[90m#x1B[39;49;00m
        _is_ssl_error_message_from_http_proxy = <function HTTPConnectionPool.urlopen.<locals>._is_ssl_error_message_from_http_proxy at 0x7fcc94d5e7a0>
        assert_same_host = False
        body       = None
        body_pos   = None
        chunked    = False
        clean_exit = False
        conn       = None
        destination_scheme = None
        err        = None
        headers    = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
        http_tunnel_required = False
        is_new_proxy_conn = False
        method     = 'GET'
        parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/', query=None, fragment=None)
        pool_timeout = None
        redirect   = False
        release_conn = False
        release_this_conn = True
        response_kw = {'decode_content': False, 'preload_content': False}
        retries    = Retry(total=0, connect=None, read=False, redirect=None, status=None)
        self       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
        timeout    = Timeout(connect=0.1, read=0.1, total=None)
        timeout_obj = Timeout(connect=0.1, read=0.1, total=None)
        url        = '/'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
method = 'GET', url = '/', response = None
error = SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))
_pool = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
_stacktrace = <traceback object at 0x7fcc94db8cc0>

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92mincrement#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        method=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        url=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        response=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        error=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        _pool=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        _stacktrace=#x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Return a new Retry object with incremented retry counters.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param response: A response object, or None, if the server did not#x1B[39;49;00m
    #x1B[33m        return a response.#x1B[39;49;00m
    #x1B[33m    :type response: :class:`~urllib3.response.HTTPResponse`#x1B[39;49;00m
    #x1B[33m    :param Exception error: An error encountered during the request, or#x1B[39;49;00m
    #x1B[33m        None if the response was received successfully.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :return: A new ``Retry`` object.#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.total #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m error:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Disabled, indicate to re-raise the error.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        total = #x1B[96mself#x1B[39;49;00m.total#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m total #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            total -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        connect = #x1B[96mself#x1B[39;49;00m.connect#x1B[90m#x1B[39;49;00m
        read = #x1B[96mself#x1B[39;49;00m.read#x1B[90m#x1B[39;49;00m
        redirect = #x1B[96mself#x1B[39;49;00m.redirect#x1B[90m#x1B[39;49;00m
        status_count = #x1B[96mself#x1B[39;49;00m.status#x1B[90m#x1B[39;49;00m
        other = #x1B[96mself#x1B[39;49;00m.other#x1B[90m#x1B[39;49;00m
        cause = #x1B[33m"#x1B[39;49;00m#x1B[33munknown#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        status = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        redirect_location = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m error #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_connection_error(error):#x1B[90m#x1B[39;49;00m
            #x1B[90m# Connect retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m connect #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m connect #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m error #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_read_error(error):#x1B[90m#x1B[39;49;00m
            #x1B[90m# Read retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m read #x1B[95mis#x1B[39;49;00m #x1B[94mFalse#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._is_method_retryable(method):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m six.reraise(#x1B[96mtype#x1B[39;49;00m(error), error, _stacktrace)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m read #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                read -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m error:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Other retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m other #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                other -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m response #x1B[95mand#x1B[39;49;00m response.get_redirect_location():#x1B[90m#x1B[39;49;00m
            #x1B[90m# Redirect retry?#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m redirect #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                redirect -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            cause = #x1B[33m"#x1B[39;49;00m#x1B[33mtoo many redirects#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            redirect_location = response.get_redirect_location()#x1B[90m#x1B[39;49;00m
            status = response.status#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[90m# Incrementing because of a server error like a 500 in#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[90m# status_forcelist and the given method is in the allowed_methods#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            cause = ResponseError.GENERIC_ERROR#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m response #x1B[95mand#x1B[39;49;00m response.status:#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m status_count #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    status_count -= #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)#x1B[90m#x1B[39;49;00m
                status = response.status#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        history = #x1B[96mself#x1B[39;49;00m.history + (#x1B[90m#x1B[39;49;00m
            RequestHistory(method, url, error, status, redirect_location),#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        new_retry = #x1B[96mself#x1B[39;49;00m.new(#x1B[90m#x1B[39;49;00m
            total=total,#x1B[90m#x1B[39;49;00m
            connect=connect,#x1B[90m#x1B[39;49;00m
            read=read,#x1B[90m#x1B[39;49;00m
            redirect=redirect,#x1B[90m#x1B[39;49;00m
            status=status_count,#x1B[90m#x1B[39;49;00m
            other=other,#x1B[90m#x1B[39;49;00m
            history=history,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m new_retry.is_exhausted():#x1B[90m#x1B[39;49;00m
>           #x1B[94mraise#x1B[39;49;00m MaxRetryError(_pool, url, error #x1B[95mor#x1B[39;49;00m ResponseError(cause))#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE           urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='127.0.0.1', port=43417): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')))#x1B[0m

_pool      = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
_stacktrace = <traceback object at 0x7fcc94db8cc0>
cause      = 'unknown'
connect    = None
error      = SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))
history    = (RequestHistory(method='GET', url='/', error=SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')), status=None, redirect_location=None),)
method     = 'GET'
new_retry  = Retry(total=-1, connect=None, read=False, redirect=None, status=None)
other      = None
read       = False
redirect   = None
redirect_location = None
response   = None
self       = Retry(total=0, connect=None, read=False, redirect=None, status=None)
status     = None
status_count = None
total      = -1
url        = '/'

#x1B[1m#x1B[31m..../py/lib/python3.11.../urllib3/util/retry.py#x1B[0m:592: MaxRetryError

#x1B[33mDuring handling of the above exception, another exception occurred:#x1B[0m

http_request_timeout = 0.1
mocker = <pytest_mock.plugin.MockerFixture object at 0x7fcc94e66210>
tls_http_server = functools.partial(<function make_tls_http_server at 0x7fcc97b78cc0>, request=<SubRequest 'tls_http_server' for <Function test_tls_client_auth[1-True-*.localhost-builtin]>>)
adapter_type = 'builtin', ca = <trustme.CA object at 0x7fcc94e64cd0>
tls_certificate = <trustme.LeafCert object at 0x7fcc94e67e90>
tls_certificate_chain_pem_path = '/tmp/tmplczcv3nv.pem'
tls_certificate_private_key_pem_path = '/tmp/tmp3lqqdz_t.pem'
tls_ca_certificate_pem_path = '/tmp/tmpzd02wbio.pem', is_trusted_cert = True
tls_client_identity = '*.localhost'
tls_verify_mode = <VerifyMode.CERT_OPTIONAL: 1>

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(  #x1B[90m# noqa: C901  # FIXME#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[33m'#x1B[39;49;00m#x1B[33madapter_type#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33mbuiltin#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33mpyopenssl#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[90m#x1B[39;49;00m
        (#x1B[33m'#x1B[39;49;00m#x1B[33mis_trusted_cert#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33mtls_client_identity#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            (#x1B[94mTrue#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33mlocalhost#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (#x1B[94mTrue#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33m127.0.0.1#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (#x1B[94mTrue#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33m*.localhost#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (#x1B[94mTrue#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33mnot_localhost#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
            (#x1B[94mFalse#x1B[39;49;00m, #x1B[33m'#x1B[39;49;00m#x1B[33mlocalhost#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[90m#x1B[39;49;00m
        #x1B[33m'#x1B[39;49;00m#x1B[33mtls_verify_mode#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        (#x1B[90m#x1B[39;49;00m
            ssl.CERT_NONE,  #x1B[90m# server shouldn't validate client cert#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            ssl.CERT_OPTIONAL,  #x1B[90m# same as CERT_REQUIRED in client mode, don't use#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            ssl.CERT_REQUIRED,  #x1B[90m# server should validate if client cert CA is OK#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        ),#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.xfail(#x1B[90m#x1B[39;49;00m
        IS_PYPY #x1B[95mand#x1B[39;49;00m IS_CI,#x1B[90m#x1B[39;49;00m
        reason=#x1B[33m'#x1B[39;49;00m#x1B[33mFails under PyPy in CI for unknown reason#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        strict=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m #x1B[92mtest_tls_client_auth#x1B[39;49;00m(  #x1B[90m# noqa: C901, WPS213  # FIXME#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# FIXME: remove twisted logic, separate tests#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        http_request_timeout,#x1B[90m#x1B[39;49;00m
        mocker,#x1B[90m#x1B[39;49;00m
        tls_http_server,#x1B[90m#x1B[39;49;00m
        adapter_type,#x1B[90m#x1B[39;49;00m
        ca,#x1B[90m#x1B[39;49;00m
        tls_certificate,#x1B[90m#x1B[39;49;00m
        tls_certificate_chain_pem_path,#x1B[90m#x1B[39;49;00m
        tls_certificate_private_key_pem_path,#x1B[90m#x1B[39;49;00m
        tls_ca_certificate_pem_path,#x1B[90m#x1B[39;49;00m
        is_trusted_cert,#x1B[90m#x1B[39;49;00m
        tls_client_identity,#x1B[90m#x1B[39;49;00m
        tls_verify_mode,#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Verify that client TLS certificate auth works correctly."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        test_cert_rejection = (#x1B[90m#x1B[39;49;00m
            tls_verify_mode != ssl.CERT_NONE #x1B[95mand#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m is_trusted_cert#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        interface, _host, port = _get_conn_data(ANY_INTERFACE_IPV4)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        client_cert_root_ca = ca #x1B[94mif#x1B[39;49;00m is_trusted_cert #x1B[94melse#x1B[39;49;00m trustme.CA()#x1B[90m#x1B[39;49;00m
        #x1B[94mwith#x1B[39;49;00m mocker.mock_module.patch(#x1B[90m#x1B[39;49;00m
            #x1B[33m'#x1B[39;49;00m#x1B[33midna.core.ulabel#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            return_value=ntob(tls_client_identity),#x1B[90m#x1B[39;49;00m
        ):#x1B[90m#x1B[39;49;00m
            client_cert = client_cert_root_ca.issue_cert(#x1B[90m#x1B[39;49;00m
                ntou(tls_client_identity),#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mdel#x1B[39;49;00m client_cert_root_ca#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mwith#x1B[39;49;00m client_cert.private_key_and_cert_chain_pem.tempfile() #x1B[94mas#x1B[39;49;00m cl_pem:#x1B[90m#x1B[39;49;00m
            tls_adapter_cls = get_ssl_adapter_class(name=adapter_type)#x1B[90m#x1B[39;49;00m
            tls_adapter = tls_adapter_cls(#x1B[90m#x1B[39;49;00m
                tls_certificate_chain_pem_path,#x1B[90m#x1B[39;49;00m
                tls_certificate_private_key_pem_path,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m adapter_type == #x1B[33m'#x1B[39;49;00m#x1B[33mpyopenssl#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                tls_adapter.context = tls_adapter.get_context()#x1B[90m#x1B[39;49;00m
                tls_adapter.context.set_verify(#x1B[90m#x1B[39;49;00m
                    _stdlib_to_openssl_verify[tls_verify_mode],#x1B[90m#x1B[39;49;00m
                    #x1B[94mlambda#x1B[39;49;00m conn, cert, errno, depth, preverify_ok: preverify_ok,#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_adapter.context.verify_mode = tls_verify_mode#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            ca.configure_trust(tls_adapter.context)#x1B[90m#x1B[39;49;00m
            tls_certificate.configure_cert(tls_adapter.context)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            tlshttpserver = tls_http_server((interface, port), tls_adapter)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            interface, _host, port = _get_conn_data(tlshttpserver.bind_addr)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            make_https_request = functools.partial(#x1B[90m#x1B[39;49;00m
                requests.get,#x1B[90m#x1B[39;49;00m
                #x1B[33mf#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33mhttps://#x1B[39;49;00m#x1B[33m{#x1B[39;49;00minterface#x1B[33m!s}#x1B[39;49;00m#x1B[33m:#x1B[39;49;00m#x1B[33m{#x1B[39;49;00mport#x1B[33m!s}#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[90m# Don't wait for the first byte forever:#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                timeout=http_request_timeout,#x1B[90m#x1B[39;49;00m
                #x1B[90m# Server TLS certificate verification:#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                verify=tls_ca_certificate_pem_path,#x1B[90m#x1B[39;49;00m
                #x1B[90m# Client TLS certificate verification:#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                cert=cl_pem,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m test_cert_rejection:#x1B[90m#x1B[39;49;00m
>               resp = make_https_request()#x1B[90m#x1B[39;49;00m

_host      = '127.0.0.1'
adapter_type = 'builtin'
ca         = <trustme.CA object at 0x7fcc94e64cd0>
cl_pem     = '/tmp/tmpq6byec1y.pem'
client_cert = <trustme.LeafCert object at 0x7fcc96fc7050>
http_request_timeout = 0.1
interface  = '127.0.0.1'
is_trusted_cert = True
make_https_request = functools.partial(<function get at 0x7fcc97cf7d80>, 'https://127.0.0.1:43417/', timeout=0.1, verify='/tmp/tmpzd02wbio.pem', cert='/tmp/tmpq6byec1y.pem')
mocker     = <pytest_mock.plugin.MockerFixture object at 0x7fcc94e66210>
port       = 43417
test_cert_rejection = False
tls_adapter = <cheroot.ssl.builtin.BuiltinSSLAdapter object at 0x7fcc97e5e190>
tls_adapter_cls = <class 'cheroot.ssl.builtin.BuiltinSSLAdapter'>
tls_ca_certificate_pem_path = '/tmp/tmpzd02wbio.pem'
tls_certificate = <trustme.LeafCert object at 0x7fcc94e67e90>
tls_certificate_chain_pem_path = '/tmp/tmplczcv3nv.pem'
tls_certificate_private_key_pem_path = '/tmp/tmp3lqqdz_t.pem'
tls_client_identity = '*.localhost'
tls_http_server = functools.partial(<function make_tls_http_server at 0x7fcc97b78cc0>, request=<SubRequest 'tls_http_server' for <Function test_tls_client_auth[1-True-*.localhost-builtin]>>)
tls_verify_mode = <VerifyMode.CERT_OPTIONAL: 1>
tlshttpserver = <cheroot.server.HTTPServer object at 0x7fcc96fc4790>

#x1B[1m#x1B[31mcheroot/test/test_ssl.py#x1B[0m:345: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/api.py#x1B[0m:73: in get
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m request(#x1B[33m"#x1B[39;49;00m#x1B[33mget#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, url, params=params, **kwargs)#x1B[90m#x1B[39;49;00m
        kwargs     = {'cert': '/tmp/tmpq6byec1y.pem', 'timeout': 0.1, 'verify': '/tmp/tmpzd02wbio.pem'}
        params     = None
        url        = 'https://127.0.0.1:43417/'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/api.py#x1B[0m:59: in request
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m session.request(method=method, url=url, **kwargs)#x1B[90m#x1B[39;49;00m
        kwargs     = {'cert': '/tmp/tmpq6byec1y.pem', 'params': None, 'timeout': 0.1, 'verify': '/tmp/tmpzd02wbio.pem'}
        method     = 'get'
        session    = <requests.sessions.Session object at 0x7fcc96fc7610>
        url        = 'https://127.0.0.1:43417/'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/sessions.py#x1B[0m:589: in request
    #x1B[0mresp = #x1B[96mself#x1B[39;49;00m.send(prep, **send_kwargs)#x1B[90m#x1B[39;49;00m
        allow_redirects = True
        auth       = None
        cert       = '/tmp/tmpq6byec1y.pem'
        cookies    = None
        data       = None
        files      = None
        headers    = None
        hooks      = None
        json       = None
        method     = 'get'
        params     = None
        prep       = <PreparedRequest [GET]>
        proxies    = {}
        req        = <Request [GET]>
        self       = <requests.sessions.Session object at 0x7fcc96fc7610>
        send_kwargs = {'allow_redirects': True, 'cert': '/tmp/tmpq6byec1y.pem', 'proxies': OrderedDict(), 'stream': False, ...}
        settings   = {'cert': '/tmp/tmpq6byec1y.pem', 'proxies': OrderedDict(), 'stream': False, 'verify': '/tmp/tmpzd02wbio.pem'}
        stream     = None
        timeout    = 0.1
        url        = 'https://127.0.0.1:43417/'
        verify     = '/tmp/tmpzd02wbio.pem'
#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/sessions.py#x1B[0m:703: in send
    #x1B[0mr = adapter.send(request, **kwargs)#x1B[90m#x1B[39;49;00m
        adapter    = <requests.adapters.HTTPAdapter object at 0x7fcc96fc6910>
        allow_redirects = True
        hooks      = {'response': []}
        kwargs     = {'cert': '/tmp/tmpq6byec1y.pem', 'proxies': OrderedDict(), 'stream': False, 'timeout': 0.1, ...}
        request    = <PreparedRequest [GET]>
        self       = <requests.sessions.Session object at 0x7fcc96fc7610>
        start      = 1750666738.3761485
        stream     = False
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7fcc96fc6910>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=0.1, read=0.1, total=None)
verify = '/tmp/tmpzd02wbio.pem', cert = '/tmp/tmpq6byec1y.pem'
proxies = OrderedDict()

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92msend#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m, request, stream=#x1B[94mFalse#x1B[39;49;00m, timeout=#x1B[94mNone#x1B[39;49;00m, verify=#x1B[94mTrue#x1B[39;49;00m, cert=#x1B[94mNone#x1B[39;49;00m, proxies=#x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    ):#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Sends PreparedRequest object. Returns Response object.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.#x1B[39;49;00m
    #x1B[33m    :param stream: (optional) Whether to stream the request content.#x1B[39;49;00m
    #x1B[33m    :param timeout: (optional) How long to wait for the server to send#x1B[39;49;00m
    #x1B[33m        data before giving up, as a float, or a :ref:`(connect timeout,#x1B[39;49;00m
    #x1B[33m        read timeout) <timeouts>` tuple.#x1B[39;49;00m
    #x1B[33m    :type timeout: float or tuple or urllib3 Timeout object#x1B[39;49;00m
    #x1B[33m    :param verify: (optional) Either a boolean, in which case it controls whether#x1B[39;49;00m
    #x1B[33m        we verify the server's TLS certificate, or a string, in which case it#x1B[39;49;00m
    #x1B[33m        must be a path to a CA bundle to use#x1B[39;49;00m
    #x1B[33m    :param cert: (optional) Any user-provided SSL certificate to be trusted.#x1B[39;49;00m
    #x1B[33m    :param proxies: (optional) The proxies dictionary to apply to the request.#x1B[39;49;00m
    #x1B[33m    :rtype: requests.Response#x1B[39;49;00m
    #x1B[33m    """#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
            conn = #x1B[96mself#x1B[39;49;00m.get_connection(request.url, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m LocationValueError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m InvalidURL(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.cert_verify(conn, request.url, verify, cert)#x1B[90m#x1B[39;49;00m
        url = #x1B[96mself#x1B[39;49;00m.request_url(request, proxies)#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m.add_headers(#x1B[90m#x1B[39;49;00m
            request,#x1B[90m#x1B[39;49;00m
            stream=stream,#x1B[90m#x1B[39;49;00m
            timeout=timeout,#x1B[90m#x1B[39;49;00m
            verify=verify,#x1B[90m#x1B[39;49;00m
            cert=cert,#x1B[90m#x1B[39;49;00m
            proxies=proxies,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        chunked = #x1B[95mnot#x1B[39;49;00m (request.body #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mor#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mContent-Length#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95min#x1B[39;49;00m request.headers)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, #x1B[96mtuple#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
            #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                connect, read = timeout#x1B[90m#x1B[39;49;00m
                timeout = TimeoutSauce(connect=connect, read=read)#x1B[90m#x1B[39;49;00m
            #x1B[94mexcept#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m #x1B[96mValueError#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mInvalid timeout #x1B[39;49;00m#x1B[33m{#x1B[39;49;00mtimeout#x1B[33m}#x1B[39;49;00m#x1B[33m. Pass a (connect, read) timeout tuple, #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                    #x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mor a single float to set both timeouts to the same value.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
        #x1B[94melif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(timeout, TimeoutSauce):#x1B[90m#x1B[39;49;00m
            #x1B[94mpass#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            timeout = TimeoutSauce(connect=timeout, read=timeout)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            resp = conn.urlopen(#x1B[90m#x1B[39;49;00m
                method=request.method,#x1B[90m#x1B[39;49;00m
                url=url,#x1B[90m#x1B[39;49;00m
                body=request.body,#x1B[90m#x1B[39;49;00m
                headers=request.headers,#x1B[90m#x1B[39;49;00m
                redirect=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                assert_same_host=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                preload_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                decode_content=#x1B[94mFalse#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                retries=#x1B[96mself#x1B[39;49;00m.max_retries,#x1B[90m#x1B[39;49;00m
                timeout=timeout,#x1B[90m#x1B[39;49;00m
                chunked=chunked,#x1B[90m#x1B[39;49;00m
            )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m (ProtocolError, #x1B[96mOSError#x1B[39;49;00m) #x1B[94mas#x1B[39;49;00m err:#x1B[90m#x1B[39;49;00m
            #x1B[94mraise#x1B[39;49;00m #x1B[96mConnectionError#x1B[39;49;00m(err, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mexcept#x1B[39;49;00m MaxRetryError #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, ConnectTimeoutError):#x1B[90m#x1B[39;49;00m
                #x1B[90m# TODO: Remove this in 3.0.0: see #2811#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, NewConnectionError):#x1B[90m#x1B[39;49;00m
                    #x1B[94mraise#x1B[39;49;00m ConnectTimeout(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, ResponseError):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m RetryError(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, _ProxyError):#x1B[90m#x1B[39;49;00m
                #x1B[94mraise#x1B[39;49;00m ProxyError(e, request=request)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96misinstance#x1B[39;49;00m(e.reason, _SSLError):#x1B[90m#x1B[39;49;00m
                #x1B[90m# This branch is for urllib3 v1.22 and later.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>               #x1B[94mraise#x1B[39;49;00m SSLError(e, request=request)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               requests.exceptions.SSLError: HTTPSConnectionPool(host='127.0.0.1', port=43417): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)')))#x1B[0m

cert       = '/tmp/tmpq6byec1y.pem'
chunked    = False
conn       = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fcc94e64910>
proxies    = OrderedDict()
request    = <PreparedRequest [GET]>
self       = <requests.adapters.HTTPAdapter object at 0x7fcc96fc6910>
stream     = False
timeout    = Timeout(connect=0.1, read=0.1, total=None)
url        = '/'
verify     = '/tmp/tmpzd02wbio.pem'

#x1B[1m#x1B[31m..../py/lib/python3.11....../site-packages/requests/adapters.py#x1B[0m:517: SSLError

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

@webknjaz webknjaz requested a review from Copilot June 30, 2025 12:33
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR shifts SSL handshake processing from the main thread to worker threads by introducing an explicit get() method in the thread pool and adding a do_handshake API to the built-in SSL adapter.

  • Removed the self.get = ... alias and implemented ThreadPool.get() to perform the SSL handshake if needed.
  • Updated the built-in SSL adapter to defer handshake on wrap and provide a do_handshake method with error handling and plaintext fallback.
  • Synchronized type stubs (.pyi) with the new get and do_handshake signatures.

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
cheroot/workers/threadpool.pyi Removed old get attribute and added a typed def get().
cheroot/workers/threadpool.py Added get() logic to invoke SSL handshake; removed alias.
cheroot/ssl/builtin.pyi Added do_handshake(conn) -> None stub.
cheroot/ssl/builtin.py Switched off auto handshake in wrap() and implemented do_handshake with helpers.
Comments suppressed due to low confidence (1)

cheroot/ssl/builtin.py:323

  • New SSL handshake logic, including plaintext fallback and error branches, should be covered by unit or integration tests to ensure correct behavior under success, SSL errors, and plain-HTTP-over-HTTPS scenarios.
    def do_handshake(self, conn):

"""
conn = self._queue.get()
ssl_adapter = self.server.ssl_adapter
Copy link

Copilot AI Jun 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accessing self.server.ssl_adapter directly can raise an AttributeError if the server has no ssl_adapter. Consider using getattr(self.server, 'ssl_adapter', None) to guard against missing attributes.

Suggested change
ssl_adapter = self.server.ssl_adapter
ssl_adapter = getattr(self.server, 'ssl_adapter', None)

Copilot uses AI. Check for mistakes.

try:
conn.socket.shutdown(socket.SHUT_RDWR)
except Exception:
# pass
Copy link

Copilot AI Jun 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The commented-out # pass line can be removed to clean up the code and avoid confusion about whether this exception block is intentional.

Suggested change
# pass

Copilot uses AI. Check for mistakes.

Args:
conn (:py:class:`~cheroot.server.HTTPConnection`): HTTP connection
"""
ssl_handshake_must_be_done = (
Copy link

Copilot AI Jun 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] This do_handshake method is long and handles multiple concerns. Consider refactoring into smaller private helpers (e.g., handle_plain_http, log_handshake_error) for readability and easier maintenance.

Copilot uses AI. Check for mistakes.

@webknjaz
Copy link
Member

@bmourgues I requested co-pilot to review, but don't take its comments too seriously (unless you double-check its suggestions by yourself): it's not good at understanding context. I haven't yet had time to make a proper review myself.
Interestingly, we just got some LLM spam on the very same topic in #751, it seems :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CherryPy/Cheroot SSL Built-in Adapter Causing Port Contention with Netcat Long SSL handshake on a connection freezes whole server

2 participants