Skip to content

Commit ba080b3

Browse files
authored
Merge pull request #54 from rosette-api/RCB-463_python_requests
Updated make_request to use Requests
2 parents 8c9ce9e + a2696f9 commit ba080b3

File tree

2 files changed

+51
-32
lines changed

2 files changed

+51
-32
lines changed

rosette/api.py

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -482,8 +482,8 @@ def call(self, parameters):
482482
'application/json')}
483483
request = requests.Request(
484484
'POST', url, files=files, headers=headers)
485-
prepared_request = request.prepare()
486485
session = requests.Session()
486+
prepared_request = session.prepare_request(request)
487487
resp = session.send(prepared_request)
488488
rdata = resp.content
489489
response_headers = {"responseHeaders": dict(resp.headers)}
@@ -512,7 +512,6 @@ def __init__(
512512
user_key=None,
513513
service_url='https://api.rosette.com/rest/v1/',
514514
retries=5,
515-
reuse_connection=True,
516515
refresh_duration=0.5,
517516
debug=False):
518517
""" Create an L{API} object.
@@ -534,22 +533,18 @@ def __init__(
534533
refresh_duration = 0
535534

536535
self.num_retries = retries
537-
self.reuse_connection = reuse_connection
538536
self.connection_refresh_duration = refresh_duration
539-
self.http_connection = None
540537
self.options = {}
541538
self.customHeaders = {}
539+
self.maxPoolSize = 1
540+
self.session = requests.Session()
542541

543-
def _connect(self, parsedUrl):
544-
""" Simple connection method
545-
@param parsedUrl: The URL on which to process
546-
"""
547-
if not self.reuse_connection or self.http_connection is None:
548-
loc = parsedUrl.netloc
549-
if parsedUrl.scheme == "https":
550-
self.http_connection = httplib.HTTPSConnection(loc)
551-
else:
552-
self.http_connection = httplib.HTTPConnection(loc)
542+
def _set_pool_size(self):
543+
adapter = requests.adapters.HTTPAdapter(pool_maxsize=self.maxPoolSize)
544+
if 'https:' in self.service_url:
545+
self.session.mount('https://', adapter)
546+
else:
547+
self.session.mount('http://', adapter)
553548

554549
def _make_request(self, op, url, data, headers):
555550
"""
@@ -561,32 +556,34 @@ def _make_request(self, op, url, data, headers):
561556
@param headers: request headers
562557
"""
563558
headers['User-Agent'] = "RosetteAPIPython/" + _BINDING_VERSION
564-
parsedUrl = urlparse.urlparse(url)
565-
566-
self._connect(parsedUrl)
567559

568560
message = None
569561
code = "unknownError"
570562
rdata = None
571563
response_headers = {}
564+
565+
request = requests.Request(op, url, data=data, headers=headers)
566+
session = requests.Session()
567+
prepared_request = session.prepare_request(request)
568+
572569
for i in range(self.num_retries + 1):
573570
try:
574-
self.http_connection.request(op, url, data, headers)
575-
response = self.http_connection.getresponse()
576-
status = response.status
577-
rdata = response.read()
578-
response_headers["responseHeaders"] = (
579-
dict(response.getheaders()))
571+
response = session.send(prepared_request)
572+
status = response.status_code
573+
rdata = response.content
574+
dict_headers = dict(response.headers)
575+
response_headers = {"responseHeaders": dict_headers}
576+
if 'x-rosetteapi-concurrency' in dict_headers:
577+
if dict_headers['x-rosetteapi-concurrency'] != self.maxPoolSize:
578+
self.maxPoolSize = dict_headers['x-rosetteapi-concurrency']
579+
self._set_pool_size()
580+
580581
if status == 200:
581-
if not self.reuse_connection:
582-
self.http_connection.close()
583582
return rdata, status, response_headers
584583
if status == 429:
585584
code = status
586585
message = "{0} ({1})".format(rdata, i)
587586
time.sleep(self.connection_refresh_duration)
588-
self.http_connection.close()
589-
self._connect(parsedUrl)
590587
continue
591588
if rdata is not None:
592589
try:
@@ -598,17 +595,15 @@ def _make_request(self, op, url, data, headers):
598595
else:
599596
code = status
600597
raise RosetteException(code, message, url)
598+
601599
except:
602600
raise
603-
except (httplib.BadStatusLine, gaierror):
601+
except requests.exceptions.RequestException as e:
604602
raise RosetteException(
605-
"ConnectionError",
603+
e.message,
606604
"Unable to establish connection to the Rosette API server",
607605
url)
608606

609-
if not self.reuse_connection:
610-
self.http_connection.close()
611-
612607
raise RosetteException(code, message, url)
613608

614609
def _get_http(self, url, headers):
@@ -644,6 +639,12 @@ def _post_http(self, url, data, headers):
644639

645640
return _ReturnObject(_my_loads(rdata, response_headers), status)
646641

642+
def getPoolSize(self):
643+
"""
644+
Returns the maximum pool size, which is the returned x-rosetteapi-concurrency value
645+
"""
646+
return int(self.maxPoolSize)
647+
647648
def setOption(self, name, value):
648649
"""
649650
Sets an option

tests/test_rosette_api.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,24 @@ def test_for_409(api, json_409):
170170
httpretty.disable()
171171
httpretty.reset()
172172

173+
# Test the maxPoolSize
174+
175+
176+
def test_the_max_pool_size(json_response, doc_params):
177+
httpretty.enable()
178+
httpretty.register_uri(httpretty.POST, "https://api.rosette.com/rest/v1/language",
179+
body=json_response, status=200, content_type="application/json",
180+
adding_headers={
181+
'x-rosetteapi-concurrency': 5
182+
})
183+
api = API('bogus_key')
184+
assert api.getPoolSize() == 1
185+
result = api.language(doc_params)
186+
assert result["name"] == "Rosette API"
187+
assert api.getPoolSize() == 5
188+
httpretty.disable()
189+
httpretty.reset()
190+
173191
# Test the language endpoint
174192

175193

0 commit comments

Comments
 (0)