const responseHandler = function()

in lib/nano.js [121:226]


  const responseHandler = function (response, req, opts, resolve, reject, callback) {
    const statusCode = response.status || (response.response && response.response.status) || 500
    if (response.isAxiosError && response.response) {
      response = response.response
    }
    let body = response.data
    response.statusCode = statusCode

    // cookie parsing
    if (response.headers) {
      const h = response.headers['set-cookie']
      if (h && h.length) {
        h.forEach((header) => {
          cfg.cookieJar.parse(header, req.url)
        })
      }
    }

    // let parsed
    const responseHeaders = Object.assign({
      uri: scrubURL(req.url),
      statusCode
    }, response.headers)
    if (!response.status) {
      if (axios.isCancel(response)) {
        if (resolve) {
          resolve('canceled')
        }
        if (callback) {
          callback(null, 'canceled', responseHeaders)
        }
        return
      }

      log({ err: 'socket', body, headers: responseHeaders })
      if (reject) {
        reject(new Error(`error happened in your connection. Reason: ${response.message}`))
      }
      if (callback) {
        const returnError = new Error(`error happened in your connection. Reason: ${response.message}`)
        returnError.scope = 'socket'
        returnError.errid = 'request'
        callback(returnError)
      }
      return
    }

    delete responseHeaders.server
    delete responseHeaders['content-length']

    /* if (opts.dontParse) {
      parsed = body
    } else {
      try { parsed = JSON.parse(body) } catch (err) { parsed = body }
    } */

    if (statusCode >= 200 && statusCode < 400) {
      log({ err: null, body, headers: responseHeaders })
      if (resolve) {
        resolve(body)
      }
      if (callback) {
        callback(null, body, responseHeaders)
      }
      return
    }

    // cloudant stacktrace
    if (typeof body === 'string') {
      body = { message: body }
    }

    if (!body.message && (body.reason || body.error)) {
      body.message = (body.reason || body.error)
    }

    // fix cloudant issues where they give an erlang stacktrace as js
    delete body.stack

    // scrub credentials
    scrubRequest(req)

    log({ err: 'couch', body, headers: responseHeaders })

    const message = body.message || 'couch returned ' + statusCode
    const errors = new Error(message)
    errors.scope = 'couch'
    errors.statusCode = statusCode
    errors.request = req
    errors.headers = responseHeaders
    errors.errid = 'non_200'
    errors.name = 'Error'
    errors.description = message
    // add any attributes from the HTTP response into the
    // Error object (except message, which would overwrite
    // the text message of the Error)
    delete body.message
    Object.assign(errors, body)

    if (reject) {
      reject(errors)
    }
    if (callback) {
      callback(errors)
    }
  }