HttpErrorHandler.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. const logger = require('logger-sharelatex')
  2. const Settings = require('settings-sharelatex')
  3. function renderJSONError(res, message, info) {
  4. const fullInfo = { ...info, message }
  5. if (info.message) {
  6. logger.warn(
  7. info,
  8. `http error info shouldn't contain a 'message' field, will be overridden`
  9. )
  10. }
  11. res.json(fullInfo)
  12. }
  13. module.exports = {
  14. badRequest(req, res, message, info) {
  15. res.status(400)
  16. switch (req.accepts(['html', 'json'])) {
  17. case 'html':
  18. return res.render('general/400', {
  19. title: 'Client Error',
  20. message: message
  21. })
  22. case 'json':
  23. return renderJSONError(res, message, info || {})
  24. default:
  25. return res.send('client error')
  26. }
  27. },
  28. conflict(req, res, message, info) {
  29. res.status(409)
  30. switch (req.accepts(['html', 'json'])) {
  31. case 'html':
  32. return res.render('general/400', {
  33. title: 'Client Error',
  34. message: message
  35. })
  36. case 'json':
  37. return renderJSONError(res, message, info || {})
  38. default:
  39. return res.send('conflict')
  40. }
  41. },
  42. forbidden(req, res, message = 'restricted', info = {}) {
  43. res.status(403)
  44. switch (req.accepts(['html', 'json'])) {
  45. case 'html':
  46. return res.render('user/restricted', { title: 'restricted' })
  47. case 'json':
  48. return renderJSONError(res, message, info)
  49. default:
  50. return res.send('restricted')
  51. }
  52. },
  53. notFound(req, res, message = 'not found', info = {}) {
  54. res.status(404)
  55. switch (req.accepts(['html', 'json'])) {
  56. case 'html':
  57. return res.render('general/404', { title: 'page_not_found' })
  58. case 'json':
  59. return renderJSONError(res, message, info)
  60. default:
  61. return res.send('not found')
  62. }
  63. },
  64. unprocessableEntity(req, res, message = 'unprocessable entity', info = {}) {
  65. res.status(422)
  66. switch (req.accepts(['html', 'json'])) {
  67. case 'html':
  68. return res.render('general/400', {
  69. title: 'Client Error',
  70. message: message
  71. })
  72. case 'json':
  73. return renderJSONError(res, message, info)
  74. default:
  75. return res.send('unprocessable entity')
  76. }
  77. },
  78. legacyInternal(req, res, message, error) {
  79. logger.error(error)
  80. res.status(500)
  81. switch (req.accepts(['html', 'json'])) {
  82. case 'html':
  83. return res.render('general/500', { title: 'Server Error' })
  84. case 'json':
  85. return renderJSONError(res, message, {})
  86. default:
  87. return res.send('internal server error')
  88. }
  89. },
  90. maintenance(req, res) {
  91. res.status(503)
  92. let message = `${Settings.appName} is currently down for maintenance.`
  93. if (Settings.statusPageUrl) {
  94. message += ` Please check https://${Settings.statusPageUrl} for updates.`
  95. }
  96. switch (req.accepts(['html', 'json'])) {
  97. case 'html':
  98. return res.render('general/closed', { title: 'maintenance' })
  99. case 'json':
  100. return renderJSONError(res, message, {})
  101. default:
  102. return res.send(message)
  103. }
  104. }
  105. }