Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
(image, error) = self._image_from_file(path)
if error:
return error
base_url = 'https://westus.api.cognitive.microsoft.com/vision/v2.0/'
url = base_url + 'recognizeText'
params = {'mode': 'Handwritten'}
headers = {'Ocp-Apim-Subscription-Key': self._credentials,
'Content-Type': 'application/octet-stream'}
# The Microsoft API for extracting text requires two phases: one call
# to submit the image for processing, then polling to wait until the
# text is ready to be retrieved.
if __debug__: log('sending file to MS cloud service')
response, error = net('post', url, headers = headers, params = params, data = image)
if isinstance(error, NetworkFailure):
if __debug__: log('network exception: {}', str(error))
return TRResult(path = path, data = {}, text = '', error = str(error))
elif isinstance(error, RateLimitExceeded):
# https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits
# The headers should have a Retry-After number in seconds.
sleep_time = 30
if 'Retry-After' in response.headers:
sleep_time = int(response.headers['Retry-After'])
if __debug__: log('sleeping for {} s and retrying', sleep_time)
sleep(sleep_time)
return self.result(path) # Recursive invocation
elif error:
raise error
if 'Operation-Location' in response.headers:
if 'Operation-Location' in response.headers:
polling_url = response.headers['Operation-Location']
else:
if __debug__: log('no operation-location in response headers')
raise ServiceFailure('Unexpected response from Microsoft server')
if __debug__: log('polling MS for results ...')
analysis = {}
poll = True
while poll:
# I never have seen results returned in 1 second, and meanwhile
# the repeated polling counts against your rate limit. So, wait
# for 2 s to reduce the number of calls.
sleep(2)
response, error = net('get', polling_url, polling = True, headers = headers)
if isinstance(error, NetworkFailure):
if __debug__: log('network exception: {}', str(error))
return TRResult(path = path, data = {}, text = '', error = str(error))
elif isinstance(error, RateLimitExceeded):
# Pause to let the server reset its timers. It seems that MS
# doesn't send back a Retry-After header when rated limited
# during polling, but I'm going to check it anyway, in case.
sleep_time = 30
if 'Retry-After' in response.headers:
sleep_time = int(response.headers['Retry-After'])
if __debug__: log('sleeping for {} s and retrying', sleep_time)
sleep(sleep_time)
elif error:
raise error
# Sometimes the response comes back without content. I don't know
if len(image) > self.max_size():
text = 'File exceeds {} byte limit for Microsoft service'.format(self.max_size())
return TRResult(path = path, data = {}, text = '', error = text)
base_url = 'https://westus.api.cognitive.microsoft.com/vision/v2.0/'
url = base_url + 'recognizeText'
params = {'mode': 'Handwritten'}
headers = {'Ocp-Apim-Subscription-Key': self._credentials,
'Content-Type': 'application/octet-stream'}
# The Microsoft API for extracting text requires two phases: one call
# to submit the image for processing, then polling to wait until the
# text is ready to be retrieved.
if __debug__: log('Sending file to MS cloud service')
response, error = net('post', url, headers = headers, params = params, data = image)
if isinstance(error, NetworkFailure):
if __debug__: log('Network exception: {}', str(error))
return TRResult(path = path, data = {}, text = '', error = str(error))
elif isinstance(error, RateLimitExceeded):
# https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits
# The headers should have a Retry-After number in seconds.
sleep_time = 30
if 'Retry-After' in response.headers:
sleep_time = int(response.headers['Retry-After'])
if __debug__: log('Sleeping for {} s and retrying', sleep_time)
sleep(sleep_time)
return self.result(path) # Recursive invocation
elif error:
raise error
if 'Operation-Location' in response.headers:
if 'Operation-Location' in response.headers:
polling_url = response.headers['Operation-Location']
else:
if __debug__: log('No operation-location in response headers')
raise ServiceFailure('Unexpected response from Microsoft server')
if __debug__: log('Polling MS for results ...')
analysis = {}
poll = True
while poll:
# I never have seen results returned in 1 second, and meanwhile
# the repeated polling counts against your rate limit. So, wait
# for 2 s to reduce the number of calls.
sleep(2)
response, error = net('get', polling_url, polling = True, headers = headers)
if isinstance(error, NetworkFailure):
if __debug__: log('Network exception: {}', str(error))
return TRResult(path = path, data = {}, text = '', error = str(error))
elif isinstance(error, RateLimitExceeded):
# Pause to let the server reset its timers. It seems that MS
# doesn't send back a Retry-After header when rated limited
# during polling, but I'm going to check it anyway, in case.
sleep_time = 30
if 'Retry-After' in response.headers:
sleep_time = int(response.headers['Retry-After'])
if __debug__: log('Sleeping for {} s and retrying', sleep_time)
sleep(sleep_time)
elif error:
raise error
# Sometimes the response comes back without content. I don't know