JustinBeckwith/retry-axios

BUG: noResponseRetries > 0 not retried

SJrX opened this issue · 0 comments

SJrX commented

Hello,

We wanted to use this project for to retry random ECONNRESET errors however we noticed that they didn't get retried at all. There were a couple issues (including another broken interceptor), but there was still a bug in this project.

// If there's no config, or retries are disabled, return.
  if (!config || config.retry === 0) {
    return false;
  }

If you are only retrying noResponseRetries we always return false.

I changed the logic to this, but it still has another bug that I didn't want to fix (which is that we should have distinct retry counters for the noResponseRetries and retry.

/**
 * Determine based on config if we should retry the request.
 * @param err The AxiosError passed to the interceptor.
 */
export function shouldRetryRequest(err: AxiosError) {
  const config = (err.config as RaxConfig).raxConfig

  // If there's no config, or retries are disabled, return.
  if (!config) {
    return false
  }

  // Only retry with configured HttpMethods.
  if (!err.config.method || config.httpMethodsToRetry!.indexOf(err.config.method.toUpperCase()) < 0) {
    return false
  }

  let retryLimit = 0
  if (err.response) {
    // This error has a response

    // If this wasn't in the list of status codes where we want
    // to automatically retry, return.
    if (err.response.status) {
      let isInRange = false
      for (const [min, max] of config.statusCodesToRetry!) {
        const status = err.response.status
        if (status >= min && status <= max) {
          isInRange = true
          break
        }
      }
      if (!isInRange) {
        return false
      }
    }
    retryLimit = config.retry || 0
  } else {
    retryLimit = config.noResponseRetries || 0
  }

  // If we are out of retry attempts, return
  return config.currentRetryAttempt < retryLimit
}