aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Shepelev <temotor@gmail.com>2019-09-16 02:10:07 +0500
committerAlex Yu <stinky2nine@users.noreply.github.com>2019-09-16 06:10:07 +0900
commitcfba1201736e0060a9cb82eab73ad49988ab7416 (patch)
tree8e90b901da315d9e7332fdaced2d5e68be0bc562
parentd498ee35017a9498cff3e9aa9887b95b988e6ca9 (diff)
downloadplatform_external_python_httplib2-cfba1201736e0060a9cb82eab73ad49988ab7416.tar.gz
platform_external_python_httplib2-cfba1201736e0060a9cb82eab73ad49988ab7416.tar.bz2
platform_external_python_httplib2-cfba1201736e0060a9cb82eab73ad49988ab7416.zip
PROXY_TYPE_SOCKS5 with str user/pass raised TypeError (#145)
https://github.com/httplib2/httplib2/issues/144 https://github.com/httplib2/httplib2/pull/115
-rw-r--r--.gitignore1
-rw-r--r--python3/httplib2/__init__.py4
-rw-r--r--python3/httplib2/socks.py22
-rw-r--r--tests/__init__.py5
-rw-r--r--tests/test_proxy.py29
5 files changed, 43 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index af48444..313decf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@
.project
.pydevproject
.pytest_cache/*
+.tags*
.tox
_httplib2_test_cache/*
bin
diff --git a/python3/httplib2/__init__.py b/python3/httplib2/__init__.py
index c6c25f8..23992aa 100644
--- a/python3/httplib2/__init__.py
+++ b/python3/httplib2/__init__.py
@@ -999,6 +999,10 @@ class ProxyInfo(object):
proxy_headers: Additional or modified headers for the proxy connect
request.
"""
+ if isinstance(proxy_user, str):
+ proxy_user = proxy_user.encode()
+ if isinstance(proxy_pass, str):
+ proxy_pass = proxy_pass.encode()
self.proxy_type, self.proxy_host, self.proxy_port, self.proxy_rdns, self.proxy_user, self.proxy_pass, self.proxy_headers = (
proxy_type,
proxy_host,
diff --git a/python3/httplib2/socks.py b/python3/httplib2/socks.py
index 24235df..2926b4e 100644
--- a/python3/httplib2/socks.py
+++ b/python3/httplib2/socks.py
@@ -206,13 +206,7 @@ class socksocket(socket.socket):
return "\r\n".join(hdrs)
def __getauthheader(self):
- username = self.__proxy[4]
- password = self.__proxy[5]
- if isinstance(username, str):
- username = username.encode()
- if isinstance(password, str):
- password = password.encode()
- auth = username + b":" + password
+ auth = self.__proxy[4] + b":" + self.__proxy[5]
return "Proxy-Authorization: Basic " + base64.b64encode(auth).decode()
def setproxy(
@@ -273,13 +267,13 @@ class socksocket(socket.socket):
elif chosenauth[1:2] == chr(0x02).encode():
# Okay, we need to perform a basic username/password
# authentication.
- self.sendall(
- chr(0x01).encode()
- + chr(len(self.__proxy[4]))
- + self.__proxy[4]
- + chr(len(self.__proxy[5]))
- + self.__proxy[5]
- )
+ packet = bytearray()
+ packet.append(0x01)
+ packet.append(len(self.__proxy[4]))
+ packet.extend(self.__proxy[4])
+ packet.append(len(self.__proxy[5]))
+ packet.extend(self.__proxy[5])
+ self.sendall(packet)
authstat = self.__recvall(2)
if authstat[0:1] != chr(0x01).encode():
# Bad response
diff --git a/tests/__init__.py b/tests/__init__.py
index 69d7d10..28959d3 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -269,7 +269,8 @@ def server_socket(fun, request_count=1, timeout=5):
gcounter[0] += 1
keep = True
keep &= gcounter[0] < request_count
- keep &= request.headers.get("connection", "").lower() != "close"
+ if request is not None:
+ keep &= request.headers.get("connection", "").lower() != "close"
return keep
def server_socket_thread(srv):
@@ -295,7 +296,7 @@ def server_socket(fun, request_count=1, timeout=5):
)
except Exception as e:
# traceback.print_exc caused IOError: concurrent operation on sys.stderr.close() under setup.py test
- sys.stderr.write(traceback.format_exc().encode())
+ print(traceback.format_exc(), file=sys.stderr)
gresult[0] = e
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
diff --git a/tests/test_proxy.py b/tests/test_proxy.py
index 56a7d99..375367f 100644
--- a/tests/test_proxy.py
+++ b/tests/test_proxy.py
@@ -32,8 +32,8 @@ def test_from_url_ident():
pi = httplib2.proxy_info_from_url("http://zoidberg:fish@someproxy:99")
assert pi.proxy_host == "someproxy"
assert pi.proxy_port == 99
- assert pi.proxy_user == "zoidberg"
- assert pi.proxy_pass == "fish"
+ assert pi.proxy_user == b"zoidberg"
+ assert pi.proxy_pass == b"fish"
def test_from_env():
@@ -146,3 +146,28 @@ def test_auth_str_bytes():
)
response, _ = http.request(uri, "GET")
assert response.status == 200
+
+
+def test_socks5_auth():
+ def proxy_conn(client, tick):
+ data = client.recv(64)
+ assert data == b"\x05\x02\x00\x02"
+ client.send(b"\x05\x02") # select username/password auth
+ data = client.recv(64)
+ assert data == b"\x01\x08user_str\x08pass_str"
+ client.send(b"\x01\x01") # deny
+ tick(None)
+
+ with tests.server_socket(proxy_conn) as uri:
+ uri_parsed = urllib.parse.urlparse(uri)
+ proxy_info = httplib2.ProxyInfo(
+ httplib2.socks.PROXY_TYPE_SOCKS5,
+ proxy_host=uri_parsed.hostname,
+ proxy_port=uri_parsed.port,
+ proxy_rdns=True,
+ proxy_user=u"user_str",
+ proxy_pass=u"pass_str",
+ )
+ http = httplib2.Http(proxy_info=proxy_info)
+ with tests.assert_raises(httplib2.socks.Socks5AuthError):
+ http.request(uri, "GET")