2424import sys
2525import time
2626import os
27- from socket import gaierror
2827import requests
2928import re
3029import warnings
3130
32- _BINDING_VERSION = '1.1.1 '
31+ _BINDING_VERSION = '1.3.0 '
3332_GZIP_BYTEARRAY = bytearray ([0x1F , 0x8b , 0x08 ])
3433
3534_IsPy3 = sys .version_info [0 ] == 3
3635
3736
38- try :
39- import urlparse
40- except ImportError :
41- import urllib .parse as urlparse
42- try :
43- import httplib
44- except ImportError :
45- import http .client as httplib
46-
4737if _IsPy3 :
4838 _GZIP_SIGNATURE = _GZIP_BYTEARRAY
4939else :
@@ -482,8 +472,8 @@ def call(self, parameters):
482472 'application/json' )}
483473 request = requests .Request (
484474 'POST' , url , files = files , headers = headers )
485- prepared_request = request .prepare ()
486475 session = requests .Session ()
476+ prepared_request = session .prepare_request (request )
487477 resp = session .send (prepared_request )
488478 rdata = resp .content
489479 response_headers = {"responseHeaders" : dict (resp .headers )}
@@ -512,7 +502,6 @@ def __init__(
512502 user_key = None ,
513503 service_url = 'https://api.rosette.com/rest/v1/' ,
514504 retries = 5 ,
515- reuse_connection = True ,
516505 refresh_duration = 0.5 ,
517506 debug = False ):
518507 """ Create an L{API} object.
@@ -534,22 +523,18 @@ def __init__(
534523 refresh_duration = 0
535524
536525 self .num_retries = retries
537- self .reuse_connection = reuse_connection
538526 self .connection_refresh_duration = refresh_duration
539- self .http_connection = None
540527 self .options = {}
541528 self .customHeaders = {}
529+ self .maxPoolSize = 1
530+ self .session = requests .Session ()
542531
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 )
532+ def _set_pool_size (self ):
533+ adapter = requests .adapters .HTTPAdapter (pool_maxsize = self .maxPoolSize )
534+ if 'https:' in self .service_url :
535+ self .session .mount ('https://' , adapter )
536+ else :
537+ self .session .mount ('http://' , adapter )
553538
554539 def _make_request (self , op , url , data , headers ):
555540 """
@@ -561,32 +546,34 @@ def _make_request(self, op, url, data, headers):
561546 @param headers: request headers
562547 """
563548 headers ['User-Agent' ] = "RosetteAPIPython/" + _BINDING_VERSION
564- parsedUrl = urlparse .urlparse (url )
565-
566- self ._connect (parsedUrl )
567549
568550 message = None
569551 code = "unknownError"
570552 rdata = None
571553 response_headers = {}
554+
555+ request = requests .Request (op , url , data = data , headers = headers )
556+ session = requests .Session ()
557+ prepared_request = session .prepare_request (request )
558+
572559 for i in range (self .num_retries + 1 ):
573560 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 ()))
561+ response = session .send (prepared_request )
562+ status = response .status_code
563+ rdata = response .content
564+ dict_headers = dict (response .headers )
565+ response_headers = {"responseHeaders" : dict_headers }
566+ if 'x-rosetteapi-concurrency' in dict_headers :
567+ if dict_headers ['x-rosetteapi-concurrency' ] != self .maxPoolSize :
568+ self .maxPoolSize = dict_headers ['x-rosetteapi-concurrency' ]
569+ self ._set_pool_size ()
570+
580571 if status == 200 :
581- if not self .reuse_connection :
582- self .http_connection .close ()
583572 return rdata , status , response_headers
584573 if status == 429 :
585574 code = status
586575 message = "{0} ({1})" .format (rdata , i )
587576 time .sleep (self .connection_refresh_duration )
588- self .http_connection .close ()
589- self ._connect (parsedUrl )
590577 continue
591578 if rdata is not None :
592579 try :
@@ -598,17 +585,15 @@ def _make_request(self, op, url, data, headers):
598585 else :
599586 code = status
600587 raise RosetteException (code , message , url )
588+
601589 except :
602590 raise
603- except ( httplib . BadStatusLine , gaierror ) :
591+ except requests . exceptions . RequestException as e :
604592 raise RosetteException (
605- "ConnectionError" ,
593+ e . message ,
606594 "Unable to establish connection to the Rosette API server" ,
607595 url )
608596
609- if not self .reuse_connection :
610- self .http_connection .close ()
611-
612597 raise RosetteException (code , message , url )
613598
614599 def _get_http (self , url , headers ):
@@ -644,6 +629,12 @@ def _post_http(self, url, data, headers):
644629
645630 return _ReturnObject (_my_loads (rdata , response_headers ), status )
646631
632+ def getPoolSize (self ):
633+ """
634+ Returns the maximum pool size, which is the returned x-rosetteapi-concurrency value
635+ """
636+ return int (self .maxPoolSize )
637+
647638 def setOption (self , name , value ):
648639 """
649640 Sets an option
@@ -842,3 +833,11 @@ def matched_name(self, parameters):
842833 @type parameters: L{NameSimilarityParameters}
843834 @return: A python dictionary containing the results of name matching."""
844835 return self .name_similarity (parameters )
836+
837+ def text_embedding (self , parameters ):
838+ """
839+ Create an L{EndpointCaller} to identify text vectors found in the texts
840+ to which it is applied and call it.
841+ @type parameters: L{DocumentParameters} or L{str}
842+ @return: A python dictionary containing the results of text embedding."""
843+ return EndpointCaller (self , "text-embedding" ).call (parameters )
0 commit comments