Created
December 19, 2017 17:12
-
-
Save arisawali2014/ae11e2973b6478edde668820b50a867d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/py/setup.py b/lib/py/setup.py | |
index c196415..61f8c44 100644 | |
--- a/lib/py/setup.py | |
+++ b/lib/py/setup.py | |
@@ -64,7 +64,7 @@ def run_setup(with_binary): | |
) | |
else: | |
extensions = dict() | |
- | |
+ | |
setup(name = 'thrift', | |
version = '1.0.0-dev', | |
description = 'Python bindings for the Apache Thrift RPC system', | |
@@ -88,6 +88,9 @@ def run_setup(with_binary): | |
'Topic :: Software Development :: Libraries', | |
'Topic :: System :: Networking' | |
], | |
+ install_requires=[ | |
+ 'urllib3', | |
+ ], | |
**extensions | |
) | |
@@ -96,7 +99,7 @@ try: | |
except BuildFailed: | |
print '*' * 80 | |
- print "An error occured while trying to compile with the C extension enabled" | |
+ print "An error occured while trying to compile with the C extension enabled" | |
print "Attempting to build without the extension now" | |
print '*' * 80 | |
diff --git a/lib/py/src/transport/THttpClient.py b/lib/py/src/transport/THttpClient.py | |
index ea80a1a..b47dd8d 100644 | |
--- a/lib/py/src/transport/THttpClient.py | |
+++ b/lib/py/src/transport/THttpClient.py | |
@@ -26,6 +26,7 @@ import urlparse | |
import warnings | |
from cStringIO import StringIO | |
+from urllib3 import HTTPConnectionPool, HTTPSConnectionPool | |
from TTransport import * | |
@@ -33,7 +34,7 @@ from TTransport import * | |
class THttpClient(TTransportBase): | |
"""Http implementation of TTransport base.""" | |
- def __init__(self, uri_or_host, port=None, path=None): | |
+ def __init__(self, uri_or_host, port=None, path=None, maxconnections=1): | |
"""THttpClient supports two different types constructor parameters. | |
THttpClient(host, port, path) - deprecated | |
@@ -52,98 +53,65 @@ class THttpClient(TTransportBase): | |
self.path = path | |
self.scheme = 'http' | |
else: | |
- parsed = urlparse.urlparse(uri_or_host) | |
+ parsed = urlparse.urlsplit(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 | |
- elif self.scheme == 'https': | |
- self.port = parsed.port or httplib.HTTPS_PORT | |
+ self.port = parsed.port | |
self.host = parsed.hostname | |
self.path = parsed.path | |
if parsed.query: | |
self.path += '?%s' % parsed.query | |
self.__wbuf = StringIO() | |
- self.__http = None | |
- self.__timeout = None | |
- self.__custom_headers = None | |
- | |
- def open(self): | |
+ self.__custom_headers = {} | |
if self.scheme == 'http': | |
- self.__http = httplib.HTTP(self.host, self.port) | |
+ pool_class = HTTPConnectionPool | |
else: | |
- self.__http = httplib.HTTPS(self.host, self.port) | |
+ pool_class = HTTPSConnectionPool | |
+ self.__pool = pool_class(self.host, self.port, maxsize=maxconnections) | |
def close(self): | |
- self.__http.close() | |
- self.__http = None | |
+ self.__resp = None | |
def isOpen(self): | |
- return self.__http is not None | |
+ return self.__resp is not None | |
def setTimeout(self, ms): | |
- if not hasattr(socket, 'getdefaulttimeout'): | |
- raise NotImplementedError | |
- | |
if ms is None: | |
- self.__timeout = None | |
+ self.__pool.timeout = None | |
else: | |
- self.__timeout = ms / 1000.0 | |
+ self.__pool.timeout = ms / 1000.0 | |
def setCustomHeaders(self, headers): | |
self.__custom_headers = headers | |
+ def addHeaders(self, **headers): | |
+ self.__custom_headers.update(headers) | |
+ | |
def read(self, sz): | |
- return self.__http.file.read(sz) | |
+ return self.__resp.read(sz) | |
def write(self, buf): | |
self.__wbuf.write(buf) | |
- def __withTimeout(f): | |
- def _f(*args, **kwargs): | |
- orig_timeout = socket.getdefaulttimeout() | |
- socket.setdefaulttimeout(args[0].__timeout) | |
- result = f(*args, **kwargs) | |
- socket.setdefaulttimeout(orig_timeout) | |
- return result | |
- return _f | |
- | |
def flush(self): | |
- if self.isOpen(): | |
- self.close() | |
- self.open() | |
- | |
# Pull data out of buffer | |
data = self.__wbuf.getvalue() | |
self.__wbuf = StringIO() | |
- # HTTP request | |
- self.__http.putrequest('POST', self.path) | |
+ # Prepare headers | |
+ user_agent = 'Python/THttpClient' | |
+ script = os.path.basename(sys.argv[0]) | |
+ if script: | |
+ user_agent = '%s (%s)' % (user_agent, urllib.quote(script)) | |
- # Write headers | |
- self.__http.putheader('Host', self.host) | |
- self.__http.putheader('Content-Type', 'application/x-thrift') | |
- self.__http.putheader('Content-Length', str(len(data))) | |
+ headers = {'Host': self.host, | |
+ 'Content-Type': 'application/x-thrift', | |
+ 'User-Agent': user_agent} | |
+ headers.update(self.__custom_headers) | |
- if not self.__custom_headers or 'User-Agent' not in self.__custom_headers: | |
- user_agent = 'Python/THttpClient' | |
- script = os.path.basename(sys.argv[0]) | |
- if script: | |
- user_agent = '%s (%s)' % (user_agent, urllib.quote(script)) | |
- self.__http.putheader('User-Agent', user_agent) | |
- | |
- if self.__custom_headers: | |
- for key, val in self.__custom_headers.iteritems(): | |
- self.__http.putheader(key, val) | |
- | |
- self.__http.endheaders() | |
- | |
- # Write payload | |
- self.__http.send(data) | |
- | |
- # Get reply to flush the request | |
- self.code, self.message, self.headers = self.__http.getreply() | |
+ # HTTP request | |
+ self.__resp = r = self.__pool.urlopen('POST', self.path, data, headers, | |
+ preload_content=False) | |
- # Decorate if we know how to timeout | |
- if hasattr(socket, 'getdefaulttimeout'): | |
- flush = __withTimeout(flush) | |
+ # Get reply | |
+ self.code, self.message, self.headers = r.status, r.reason, r.headers |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment