docs: def _should_retry(self, context):
          # type: (ExponentialRetryWithMaxWait,
          #        azure.storage.common.models.RetryContext) -> bool
          """Determine if retry should happen or not
          :param ExponentialRetryWithMaxWait self: this
          :param azure.storage.common.models.RetryContext context: retry context
          :rtype: bool
          :return: True if retry should happen, False otherwise
          """
          # do not retry if max attempts equal or exceeded
          if context.count >= self.max_attempts:
              return False
  
          # get response status
          status = None
          if context.response and context.response.status:
              status = context.response.status
  
          # if there is no response status, then handle the exception
          # appropriately from the lower layer
          if status is None:
              exc = context.exception
              # default to not retry in unknown/unhandled exception case
              ret = False
              # requests timeout, retry
              if isinstance(exc, requests.Timeout):
                  ret = True
              elif isinstance(exc, requests.exceptions.ContentDecodingError):
                  ret = True
              elif (isinstance(exc, requests.exceptions.ConnectionError) or
                    isinstance(exc, requests.exceptions.ChunkedEncodingError)):
                  # newer versions of requests do not expose errno on the
                  # args[0] reason object; manually string parse
                  if isinstance(exc.args[0], urllib3.exceptions.MaxRetryError):
                      try:
                          msg = exc.args[0].reason.args[0]
                      except (AttributeError, IndexError):
                          # unexpected/malformed exception hierarchy, don't retry
                          pass
                      else:
                          if any(x in msg for x in _RETRYABLE_ERRNO_MAXRETRY):
                              ret = True
                  elif isinstance(exc.args[0], urllib3.exceptions.ProtocolError):
                      try:
                          msg = exc.args[0].args[0]
                      except (AttributeError, IndexError):
                          # unexpected/malformed exception hierarchy, don't retry
                          pass
                      else:
                          if any(x in msg for x in _RETRYABLE_ERRNO_PROTOCOL):
                              ret = True
              # fallback to string search
              if not ret:
                  msg = str(exc).lower()
                  if any(x in msg for x in _RETRYABLE_STRING_FALLBACK):
                      ret = True
              return ret
          elif 200 <= status < 300:
              # failure during respond body download or parsing, so success
              # codes should be retried
              return True
          elif 300 <= status < 500:
              # response code 404 should be retried if secondary was used
              if (status == 404 and
                      context.location_mode ==
                      azure.storage.common.models.LocationMode.SECONDARY):
                  return True
              # response code 408 is a timeout and should be retried
              # response code 429 is too many requests (throttle)
              # TODO use "Retry-After" header for backoff amount
              if status == 408 or status == 429:
                  return True
              return False
          elif status >= 500:
              # response codes above 500 should be retried except for
              # 501 (not implemented) and 505 (version not supported)
              if status == 501 or status == 505:
                  return False
              return True
          else:  # noqa
              # this should be unreachable, retry anyway
              return True