26
26
from . import ssl_wrap_socket
27
27
from .compat import (
28
28
BAD_REQUEST , SERVICE_UNAVAILABLE , GATEWAY_TIMEOUT ,
29
- FORBIDDEN ,
29
+ FORBIDDEN , BAD_GATEWAY ,
30
30
UNAUTHORIZED , INTERNAL_SERVER_ERROR , OK , BadStatusLine )
31
31
from .compat import (Queue , EmptyQueue )
32
32
from .compat import (TO_UNICODE , urlencode )
37
37
from .errors import (Error , OperationalError , DatabaseError , ProgrammingError ,
38
38
GatewayTimeoutError , ServiceUnavailableError ,
39
39
InterfaceError , InternalServerError , ForbiddenError ,
40
- BadRequest )
40
+ BadGatewayError , BadRequest )
41
41
from .gzip_decoder import (decompress_raw_data )
42
42
from .sqlstate import (SQLSTATE_CONNECTION_NOT_EXISTS ,
43
43
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED ,
95
95
SERVICE_UNAVAILABLE : ServiceUnavailableError ,
96
96
GATEWAY_TIMEOUT : GatewayTimeoutError ,
97
97
BAD_REQUEST : BadRequest ,
98
+ BAD_GATEWAY : BadGatewayError ,
98
99
}
99
100
100
101
@@ -295,7 +296,9 @@ def authenticate(self, account, user, password, master_token=None,
295
296
"body['data']: %s" ,
296
297
{k : v for (k , v ) in body [u'data' ].items () if k != u'PASSWORD' })
297
298
298
- ret = self ._post_request (url , headers , json .dumps (body ))
299
+ # retry 10 times for authentication
300
+ ret = self ._post_request (
301
+ url , headers , json .dumps (body ), retry = 10 )
299
302
# this means we are waiting for MFA authentication
300
303
if ret [u'data' ].get (u'nextAction' ) and ret [u'data' ][
301
304
u'nextAction' ] == u'EXT_AUTHN_DUO_ALL' :
@@ -304,7 +307,8 @@ def authenticate(self, account, user, password, master_token=None,
304
307
self .ret = None
305
308
306
309
def post_request_wrapper (self , url , headers , body ):
307
- self .ret = self ._post_request (url , headers , body )
310
+ # retry 10 times for MFA approval
311
+ self .ret = self ._post_request (url , headers , body , retry = 10 )
308
312
309
313
# send new request to wait until MFA is approved
310
314
t = Thread (target = post_request_wrapper ,
@@ -316,14 +320,16 @@ def post_request_wrapper(self, url, headers, body):
316
320
while not self .ret :
317
321
next (c )
318
322
else :
319
- t .join ()
323
+ t .join (timeout = 120 )
320
324
ret = self .ret
321
325
if ret [u'data' ].get (u'nextAction' ) and ret [u'data' ][
322
326
u'nextAction' ] == u'EXT_AUTHN_SUCCESS' :
323
327
body = copy .deepcopy (body_template )
324
328
body [u'inFlightCtx' ] = ret [u'data' ][u'inFlightCtx' ]
325
329
# final request to get tokens
326
- ret = self ._post_request (url , headers , json .dumps (body ))
330
+ # retry 10 times
331
+ ret = self ._post_request (
332
+ url , headers , json .dumps (body ), retry = 10 )
327
333
328
334
elif ret [u'data' ].get (u'nextAction' ) and ret [u'data' ][
329
335
u'nextAction' ] == u'PWD_CHANGE' :
@@ -333,7 +339,9 @@ def post_request_wrapper(self, url, headers, body):
333
339
body [u'data' ][u"LOGIN_NAME" ] = user
334
340
body [u'data' ][u"PASSWORD" ] = password
335
341
body [u'data' ][u'CHOSEN_NEW_PASSWORD' ] = password_callback ()
336
- ret = self ._post_request (url , headers , json .dumps (body ))
342
+ # retry 10 times for New Password input
343
+ ret = self ._post_request (
344
+ url , headers , json .dumps (body ), retry = 10 )
337
345
338
346
self .logger .debug (u'completed authentication' )
339
347
if not ret [u'success' ]:
@@ -373,7 +381,7 @@ def post_request_wrapper(self, url, headers, body):
373
381
self ._connection ._warehouse = session_info [u'warehouseName' ]
374
382
375
383
def request (self , url , body = None , method = u'post' , client = u'sfsql' ,
376
- _no_results = False ):
384
+ _no_results = False , retry = 10 ):
377
385
if body is None :
378
386
body = {}
379
387
if not hasattr (self , u'_master_token' ):
@@ -396,11 +404,12 @@ def request(self, url, body=None, method=u'post', client=u'sfsql',
396
404
u"User-Agent" : PYTHON_CONNECTOR_USER_AGENT ,
397
405
}
398
406
if method == u'post' :
399
- return self ._post_request (url , headers , json . dumps ( body ),
400
- token = self . _token ,
401
- _no_results = _no_results )
407
+ return self ._post_request (
408
+ url , headers , json . dumps ( body ) ,
409
+ token = self . _token , _no_results = _no_results , retry = retry )
402
410
else :
403
- return self ._get_request (url , headers , token = self ._token )
411
+ return self ._get_request (
412
+ url , headers , token = self ._token , retry = retry )
404
413
405
414
def _renew_session (self ):
406
415
if not hasattr (self , u'_master_token' ):
0 commit comments