import functools
import http.client
import io
-import socket
import ssl
import urllib.error
import urllib.parse
InstanceStoreMixin,
add_accept_encoding_header,
create_connection,
+ create_socks_proxy_socket,
get_redirect_method,
make_socks_proxy_opts,
select_proxy,
)
from ..dependencies import brotli
from ..socks import ProxyError as SocksProxyError
-from ..socks import sockssocket
from ..utils import update_url_query
from ..utils.networking import normalize_url
if 300 <= resp.code < 400:
location = resp.headers.get('Location')
if location:
- # As of RFC 2616 default charset is iso-8859-1 that is respected by python 3
+ # As of RFC 2616 default charset is iso-8859-1 that is respected by Python 3
location = location.encode('iso-8859-1').decode()
location_escaped = normalize_url(location)
if location != location_escaped:
_create_connection = create_connection
def connect(self):
- def sock_socket_connect(ip_addr, timeout, source_address):
- af, socktype, proto, canonname, sa = ip_addr
- sock = sockssocket(af, socktype, proto)
- try:
- connect_proxy_args = proxy_args.copy()
- connect_proxy_args.update({'addr': sa[0], 'port': sa[1]})
- sock.setproxy(**connect_proxy_args)
- if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: # noqa: E721
- sock.settimeout(timeout)
- if source_address:
- sock.bind(source_address)
- sock.connect((self.host, self.port))
- return sock
- except socket.error:
- sock.close()
- raise
self.sock = create_connection(
- (proxy_args['addr'], proxy_args['port']), timeout=self.timeout,
- source_address=self.source_address, _create_socket_func=sock_socket_connect)
+ (proxy_args['addr'], proxy_args['port']),
+ timeout=self.timeout,
+ source_address=self.source_address,
+ _create_socket_func=functools.partial(
+ create_socks_proxy_socket, (self.host, self.port), proxy_args))
if isinstance(self, http.client.HTTPSConnection):
self.sock = self._context.wrap_socket(self.sock, server_hostname=self.host)
def handle_response_read_exceptions(e):
if isinstance(e, http.client.IncompleteRead):
- raise IncompleteRead(partial=e.partial, cause=e, expected=e.expected) from e
+ raise IncompleteRead(partial=len(e.partial), cause=e, expected=e.expected) from e
elif isinstance(e, ssl.SSLError):
handle_sslerror(e)
elif isinstance(e, (OSError, EOFError, http.client.HTTPException, *CONTENT_DECODE_ERRORS)):
)
opener = self._get_instance(
- proxies=request.proxies or self.proxies,
- cookiejar=request.extensions.get('cookiejar') or self.cookiejar
+ proxies=self._get_proxies(request),
+ cookiejar=self._get_cookiejar(request)
)
try:
- res = opener.open(urllib_req, timeout=float(request.extensions.get('timeout') or self.timeout))
+ res = opener.open(urllib_req, timeout=self._calculate_timeout(request))
except urllib.error.HTTPError as e:
if isinstance(e.fp, (http.client.HTTPResponse, urllib.response.addinfourl)):
# Prevent file object from being closed when urllib.error.HTTPError is destroyed.