Skip to content

Instantly share code, notes, and snippets.

@rquast
Created July 11, 2017 12:20
Show Gist options
  • Save rquast/d6a3d24f935b0d7fdcc1013c5742f764 to your computer and use it in GitHub Desktop.
Save rquast/d6a3d24f935b0d7fdcc1013c5742f764 to your computer and use it in GitHub Desktop.
/**
* Module dependencies
*/
var qs = require('qs')
var log = require('node-gelf')('graylog.cavy.io')
log.fields.facility = 'cavy-connect'
/**
* Error Response
*/
function error (err, req, res, next) {
var message
var errorName = err.error || err.message || err.name
var errorDescription = err.error_description || err.description || err.message
log.error.a(errorName, errorDescription, req.headers)
// 302 Redirect
if (err.statusCode === 302 && err.redirect_uri) {
var params = req.connectParams || req.query
var responseMode = (params.response_mode && params.response_mode.trim()) ||
(params.response_type === 'code' ||
params.response_type === 'none') ? '?' : '#'
var error = { error: errorName, error_description: errorDescription }
var uri = err.redirect_uri + responseMode + qs.stringify(error)
res.redirect(uri)
// 400 Validation Error
} else if (err.name === 'ValidationError') {
res.set({
'Cache-Control': 'no-store',
'Pragma': 'no-cache'
})
res.status(400).json({
error: 'validation_error',
error_description: err.message,
errors: err.errors
})
// 400 Bad Request
} else if (err.statusCode === 400) {
res.set({
'Cache-Control': 'no-store',
'Pragma': 'no-cache'
})
res.status(400).json({
error: errorName,
error_description: errorDescription,
error_uri: err.error_uri
})
// 401 Unauthorized
} else if (err.statusCode === 401) {
// rfc 6750 Bearer Token
// http://tools.ietf.org/html/rfc6750#section-3
res.set({
'WWW-Authenticate': 'Bearer ' +
'realm="' + err.realm + '", ' +
'error="' + errorName + '", ' +
'error_description="' + errorDescription + '"'
})
res.status(401).send('Unauthorized<br><br>' + errorDescription)
// 403 Forbidden
} else if (err.statusCode === 403) {
message = 'Forbidden'
if (req.app.get('env') === 'development') {
message += '<br><br>' + errorDescription
}
res.status(403).send(message)
// 500 Internal Server Error
} else {
var statusCode = err.statusCode || 500
message = (err.statusCode && err.message) || 'Internal Server Error'
if (req.app.get('env') === 'development') {
message += '<br><br>' + errorDescription
}
res.status(statusCode).send(message)
}
}
/**
* Exports
*/
module.exports = error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment