index.js (2088B)
1 /*! 2 * statuses 3 * Copyright(c) 2014 Jonathan Ong 4 * Copyright(c) 2016 Douglas Christopher Wilson 5 * MIT Licensed 6 */ 7 8 'use strict' 9 10 /** 11 * Module dependencies. 12 * @private 13 */ 14 15 var codes = require('./codes.json') 16 17 /** 18 * Module exports. 19 * @public 20 */ 21 22 module.exports = status 23 24 // status code to message map 25 status.STATUS_CODES = codes 26 27 // array of status codes 28 status.codes = populateStatusesMap(status, codes) 29 30 // status codes for redirects 31 status.redirect = { 32 300: true, 33 301: true, 34 302: true, 35 303: true, 36 305: true, 37 307: true, 38 308: true 39 } 40 41 // status codes for empty bodies 42 status.empty = { 43 204: true, 44 205: true, 45 304: true 46 } 47 48 // status codes for when you should retry the request 49 status.retry = { 50 502: true, 51 503: true, 52 504: true 53 } 54 55 /** 56 * Populate the statuses map for given codes. 57 * @private 58 */ 59 60 function populateStatusesMap (statuses, codes) { 61 var arr = [] 62 63 Object.keys(codes).forEach(function forEachCode (code) { 64 var message = codes[code] 65 var status = Number(code) 66 67 // Populate properties 68 statuses[status] = message 69 statuses[message] = status 70 statuses[message.toLowerCase()] = status 71 72 // Add to array 73 arr.push(status) 74 }) 75 76 return arr 77 } 78 79 /** 80 * Get the status code. 81 * 82 * Given a number, this will throw if it is not a known status 83 * code, otherwise the code will be returned. Given a string, 84 * the string will be parsed for a number and return the code 85 * if valid, otherwise will lookup the code assuming this is 86 * the status message. 87 * 88 * @param {string|number} code 89 * @returns {number} 90 * @public 91 */ 92 93 function status (code) { 94 if (typeof code === 'number') { 95 if (!status[code]) throw new Error('invalid status code: ' + code) 96 return code 97 } 98 99 if (typeof code !== 'string') { 100 throw new TypeError('code must be a number or string') 101 } 102 103 // '403' 104 var n = parseInt(code, 10) 105 if (!isNaN(n)) { 106 if (!status[n]) throw new Error('invalid status code: ' + n) 107 return n 108 } 109 110 n = status[code.toLowerCase()] 111 if (!n) throw new Error('invalid status message: "' + code + '"') 112 return n 113 }