diff options
author | Sergey Shepelev <temotor@gmail.com> | 2019-09-16 02:10:07 +0500 |
---|---|---|
committer | Alex Yu <stinky2nine@users.noreply.github.com> | 2019-09-16 06:10:07 +0900 |
commit | cfba1201736e0060a9cb82eab73ad49988ab7416 (patch) | |
tree | 8e90b901da315d9e7332fdaced2d5e68be0bc562 | |
parent | d498ee35017a9498cff3e9aa9887b95b988e6ca9 (diff) | |
download | platform_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-- | .gitignore | 1 | ||||
-rw-r--r-- | python3/httplib2/__init__.py | 4 | ||||
-rw-r--r-- | python3/httplib2/socks.py | 22 | ||||
-rw-r--r-- | tests/__init__.py | 5 | ||||
-rw-r--r-- | tests/test_proxy.py | 29 |
5 files changed, 43 insertions, 18 deletions
@@ -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") |