From bbf59ff8597f8be68c3fe43093762966e826050c Mon Sep 17 00:00:00 2001 From: Kostya Esmukov Date: Wed, 10 May 2017 11:31:17 +0300 Subject: [PATCH] Move `self.proxy_headers` call into get_connection of requests adapter This fixes a possible situation when calling get_connection with the same arguments but different proxy_headers would reuse an already created connection, so the new proxy_headers will be ignored. https://github.com/Lukasa/hyper/pull/322#discussion_r115501317 --- hyper/contrib.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/hyper/contrib.py b/hyper/contrib.py index e1df19ca..ee31e77a 100644 --- a/hyper/contrib.py +++ b/hyper/contrib.py @@ -31,8 +31,7 @@ def __init__(self, *args, **kwargs): #: A mapping between HTTP netlocs and ``HTTP20Connection`` objects. self.connections = {} - def get_connection(self, host, port, scheme, cert=None, proxy=None, - proxy_headers=None): + def get_connection(self, host, port, scheme, cert=None, proxy=None): """ Gets an appropriate HTTP/2 connection object based on host/port/scheme/cert tuples. @@ -46,6 +45,13 @@ def get_connection(self, host, port, scheme, cert=None, proxy=None, if cert is not None: ssl_context = init_context(cert=cert) + if proxy: + proxy_headers = self.proxy_headers(proxy) + proxy_netloc = urlparse(proxy).netloc + else: + proxy_headers = None + proxy_netloc = None + connection_key = (host, port, scheme, cert, proxy) try: conn = self.connections[connection_key] @@ -55,7 +61,7 @@ def get_connection(self, host, port, scheme, cert=None, proxy=None, port, secure=secure, ssl_context=ssl_context, - proxy_host=proxy, + proxy_host=proxy_netloc, proxy_headers=proxy_headers) self.connections[connection_key] = conn @@ -66,11 +72,8 @@ def send(self, request, stream=False, cert=None, proxies=None, **kwargs): Sends a HTTP message to the server. """ proxy = select_proxy(request.url, proxies) - proxy_headers = None if proxy: proxy = prepend_scheme_if_needed(proxy, 'http') - proxy_headers = self.proxy_headers(proxy) - proxy = urlparse(proxy).netloc parsed = urlparse(request.url) conn = self.get_connection( @@ -78,8 +81,7 @@ def send(self, request, stream=False, cert=None, proxies=None, **kwargs): parsed.port, parsed.scheme, cert=cert, - proxy=proxy, - proxy_headers=proxy_headers) + proxy=proxy) # Build the selector. selector = parsed.path