Вход Регистрация
Файл: error-kitty/node_modules/express/node_modules/finalhandler/index.js
Строк: 146
<?php
/*!
 * finalhandler
 * Copyright(c) 2014 Douglas Christopher Wilson
 * MIT Licensed
 */

/**
 * Module dependencies.
 */

var debug = require('debug')('finalhandler')
var 
escapeHtml = require('escape-html')
var 
http = require('http')

/**
 * Variables.
 */

/* istanbul ignore next */
var defer typeof setImmediate === 'function'
  
setImmediate
  
: function(fn){ process.nextTick(fn.bind.apply(fnarguments)) }

/**
 * Module exports.
 */

module.exports finalhandler

/**
 * Final handler:
 *
 * @param {Request} req
 * @param {Response} res
 * @param {Object} [options]
 * @return {Function}
 * @api public
 */

function finalhandler(reqresoptions) {
  
options options || {}

  
// get environment
  
var env options.env || process.env.NODE_ENV || 'development'

  
// get error callback
  
var onerror options.onerror

  
return function (err) {
    var 
msg

    
// unhandled error
    
if (err) {
      
// default status code to 500
      
if (!res.statusCode || res.statusCode 400) {
        
res.statusCode 500
      
}

      
// respect err.status
      
if (err.status) {
        
res.statusCode err.status
      
}

      
// production gets a basic error message
      
var msg env === 'production'
        
http.STATUS_CODES[res.statusCode]
        : 
err.stack || err.toString()
      
msg escapeHtml(msg)
        .
replace(/n/g'<br>')
        .
replace(/  /g' &nbsp;') + 'n'
    
} else {
      
res.statusCode 404
      msg 
'Cannot ' escapeHtml(req.method) + ' ' escapeHtml(req.originalUrl || req.url) + 'n'
    
}

    
debug('default %s'res.statusCode)

    
// schedule onerror callback
    
if (err && onerror) {
      
defer(onerrorerrreqres)
    }

    
// cannot actually respond
    
if (res._header) {
      return 
req.socket.destroy()
    }

    
send(reqresres.statusCodemsg)
  }
}

/**
 * Send response.
 *
 * @param {IncomingMessage} req
 * @param {OutgoingMessage} res
 * @param {number} status
 * @param {string} body
 * @api private
 */

function send(reqresstatusbody) {
  function 
write() {
    
res.statusCode status

    
// security header for content sniffing
    
res.setHeader('X-Content-Type-Options''nosniff')

    
// standard headers
    
res.setHeader('Content-Type''text/html; charset=utf-8')
    
res.setHeader('Content-Length'Buffer.byteLength(body'utf8'))

    if (
req.method === 'HEAD') {
      
res.end()
      return
    }

    
res.end(body'utf8')
  }

  if (!
req.readable) {
    
write()
    return
  }

  
// unpipe everything from the request
  
unpipe(req)

  
// flush the request
  
req.once('end'write)
  
req.resume()
}

/**
 * Unpipe everything from a stream.
 *
 * @param {Object} stream
 * @api private
 */

/* istanbul ignore next: implementation differs between versions */
function unpipe(stream) {
  if (
typeof stream.unpipe === 'function') {
    
// new-style
    
stream.unpipe()
    return
  }

  
// Node.js 0.8 hack
  
var listener
  
var listeners stream.listeners('close')

  for (var 
0listeners.lengthi++) {
    
listener listeners[i]

    if (
listener.name !== 'cleanup' && listener.name !== 'onclose') {
      continue
    }

    
// invoke the listener
    
listener.call(stream)
  }
}
?>
Онлайн: 1
Реклама