Skip to content

Instantly share code, notes, and snippets.

@arisawali2014
Created December 19, 2017 17:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arisawali2014/ae11e2973b6478edde668820b50a867d to your computer and use it in GitHub Desktop.
Save arisawali2014/ae11e2973b6478edde668820b50a867d to your computer and use it in GitHub Desktop.
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
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
print
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