Example #1
0
exports.transform = function(t, src) {
  var out = Simple(t)
  pipe(src, t, function(err) {
    out.push(err)
  })
  return out
}
Example #2
0
module.exports = function send(req, cb) {
  util.setContentLength(req.headers, req.body)

  var url = req.url
  var secure = 'https' == url.protocol

  var nativeReq = (secure ? https : http).request({
    method: req.method,
    path: url.path,
    hostname: url.hostname,
    port: url.port,
    headers: req.headers
  })

  var aborted = false
  var completed = false
  var body

  function done(err, res) {
    if (completed) {
      if (err) console.warn(err.stack)
      console.warn('agent-next: Response callback was called more than once.')
      console.warn('agent-next: This might be due to non-conformant http server implementation.')
      return
    }
    completed = true
    if (err) return cb(err)
    body = Simple(res)
    cb(null, new Response(res.statusCode, res.headers, body))
  }

  nativeReq
  .on('error', function(err) {
    if (!aborted) done(err)
  })
  .on('response', function(res) {
    done(null, res)
  })

  if (req.timeout) {
    var timer = setTimeout(function() {
      aborted = true
      timer = null
      var err = new Error('Timeout of ' + req.timeout + 'ms exceeded.')
      err.code = 'ETIMEDOUT'
      body ? body.push(err) : done(err)
      nativeReq.abort()
    }, req.timeout)

    function clearTimer() {
      timer && clearTimeout(timer)
    }

    nativeReq.on('end', clearTimer)
    nativeReq.on('close', clearTimer)
  }

  if (util.isStream(req.body))
    pipe(req.body, nativeReq, done)
  else
    nativeReq.end(req.body)
}