THRIFT-1857 Python 3 Support
Client: Python
Patch: Thomas Bartelmess, Eevee (Alex Munroe), helgridly, Christian Verkerk, Jeroen Vlek, Nobuaki Sukegawa
This closes #213 and closes #680
diff --git a/lib/py/src/transport/THttpClient.py b/lib/py/src/transport/THttpClient.py
index 5851fa2..5abd41c 100644
--- a/lib/py/src/transport/THttpClient.py
+++ b/lib/py/src/transport/THttpClient.py
@@ -17,17 +17,17 @@
# under the License.
#
-import httplib
+from io import BytesIO
import os
import socket
import sys
-import urllib
-import urlparse
import warnings
-from cStringIO import StringIO
+from six.moves import urllib
+from six.moves import http_client
-from TTransport import *
+from .TTransport import *
+import six
class THttpClient(TTransportBase):
@@ -52,31 +52,33 @@
self.path = path
self.scheme = 'http'
else:
- parsed = urlparse.urlparse(uri_or_host)
+ parsed = urllib.parse.urlparse(uri_or_host)
self.scheme = parsed.scheme
assert self.scheme in ('http', 'https')
if self.scheme == 'http':
- self.port = parsed.port or httplib.HTTP_PORT
+ self.port = parsed.port or http_client.HTTP_PORT
elif self.scheme == 'https':
- self.port = parsed.port or httplib.HTTPS_PORT
+ self.port = parsed.port or http_client.HTTPS_PORT
self.host = parsed.hostname
self.path = parsed.path
if parsed.query:
self.path += '?%s' % parsed.query
- self.__wbuf = StringIO()
+ self.__wbuf = BytesIO()
self.__http = None
+ self.__http_response = None
self.__timeout = None
self.__custom_headers = None
def open(self):
if self.scheme == 'http':
- self.__http = httplib.HTTP(self.host, self.port)
+ self.__http = http_client.HTTPConnection(self.host, self.port)
else:
- self.__http = httplib.HTTPS(self.host, self.port)
+ self.__http = http_client.HTTPSConnection(self.host, self.port)
def close(self):
self.__http.close()
self.__http = None
+ self.__http_response = None
def isOpen(self):
return self.__http is not None
@@ -94,7 +96,7 @@
self.__custom_headers = headers
def read(self, sz):
- return self.__http.file.read(sz)
+ return self.__http_response.read(sz)
def write(self, buf):
self.__wbuf.write(buf)
@@ -117,13 +119,12 @@
# Pull data out of buffer
data = self.__wbuf.getvalue()
- self.__wbuf = StringIO()
+ self.__wbuf = BytesIO()
# HTTP request
self.__http.putrequest('POST', self.path)
# Write headers
- self.__http.putheader('Host', self.host)
self.__http.putheader('Content-Type', 'application/x-thrift')
self.__http.putheader('Content-Length', str(len(data)))
@@ -131,11 +132,11 @@
user_agent = 'Python/THttpClient'
script = os.path.basename(sys.argv[0])
if script:
- user_agent = '%s (%s)' % (user_agent, urllib.quote(script))
+ user_agent = '%s (%s)' % (user_agent, urllib.parse.quote(script))
self.__http.putheader('User-Agent', user_agent)
if self.__custom_headers:
- for key, val in self.__custom_headers.iteritems():
+ for key, val in six.iteritems(self.__custom_headers):
self.__http.putheader(key, val)
self.__http.endheaders()
@@ -144,7 +145,10 @@
self.__http.send(data)
# Get reply to flush the request
- self.code, self.message, self.headers = self.__http.getreply()
+ self.__http_response = self.__http.getresponse()
+ self.code = self.__http_response.status
+ self.message = self.__http_response.reason
+ self.headers = self.__http_response.msg
# Decorate if we know how to timeout
if hasattr(socket, 'getdefaulttimeout'):