44from requests .exceptions import JSONDecodeError as RequestsJSONDecodeError
55
66from office365_api .v2 .exceptions import (Office365ClientError ,
7+ Office365QuotaExceededError ,
78 Office365ServerError )
89
910from .base import BaseService
1011
1112logger = logging .getLogger (__name__ )
1213
14+
1315class BatchService (BaseService ):
1416 def __init__ (self , client , beta = True ):
1517 self .client = client
@@ -35,7 +37,8 @@ def add(self, request, callback=None):
3537
3638 def _execute (self , requests ):
3739 if self .is_empty :
38- raise Office365ClientError (error_message = 'No requests to execute in a batch' )
40+ raise Office365ClientError (
41+ error_message = 'No requests to execute in a batch' )
3942 method = 'POST'
4043 default_headers = {'Content-Type' : 'application/json' }
4144 logger .info ('{}: {} with {}x requests' .format (
@@ -54,6 +57,16 @@ def _execute(self, requests):
5457 except (ValueError , RequestsJSONDecodeError ):
5558 error_data = {
5659 'error' : {'message' : e .response .content , 'code' : 'unknown' }}
60+ if e .response .status_code == 429 :
61+ retry_after = None
62+ try :
63+ retry_after = int (
64+ e .response .headers .get ('Retry-After' ))
65+ except Exception as ex :
66+ logger .error (
67+ 'Error parsing Retry-After header: %s' , ex )
68+ raise Office365QuotaExceededError (
69+ data = error_data , retry_after = retry_after ) from e
5770 raise Office365ClientError (e .response .status_code , error_data )
5871 else :
5972 raise Office365ServerError (
@@ -76,6 +89,16 @@ def execute(self):
7689 try :
7790 if response ['status' ] >= 300 :
7891 error_data = response .get ('body' )
92+ if response ['status' ] == 429 :
93+ retry_after = None
94+ try :
95+ retry_after = int (
96+ response ['headers' ].get ('Retry-After' ))
97+ except Exception as ex :
98+ logger .warning (
99+ 'Error parsing Retry-After header: %s' , ex )
100+ raise Office365QuotaExceededError (
101+ data = error_data , retry_after = retry_after )
79102 raise Office365ClientError (response ['status' ], error_data )
80103 except Office365ClientError as e :
81104 exception = e
0 commit comments