blob: e163f5ac90fb8aa3802232175d5beb0368bc7b4e [file] [log] [blame]
var STATUS_CODES = { '100': 'Continue',
'101': 'Switching Protocols',
'102': 'Processing',
'200': 'OK',
'201': 'Created',
'202': 'Accepted',
'203': 'Non-Authoritative Information',
'204': 'No Content',
'205': 'Reset Content',
'206': 'Partial Content',
'207': 'Multi-Status',
'300': 'Multiple Choices',
'301': 'Moved Permanently',
'302': 'Moved Temporarily',
'303': 'See Other',
'304': 'Not Modified',
'305': 'Use Proxy',
'307': 'Temporary Redirect',
'400': 'Bad Request',
'401': 'Unauthorized',
'402': 'Payment Required',
'403': 'Forbidden',
'404': 'Not Found',
'405': 'Method Not Allowed',
'406': 'Not Acceptable',
'407': 'Proxy Authentication Required',
'408': 'Request Time-out',
'409': 'Conflict',
'410': 'Gone',
'411': 'Length Required',
'412': 'Precondition Failed',
'413': 'Request Entity Too Large',
'414': 'Request-URI Too Large',
'415': 'Unsupported Media Type',
'416': 'Requested Range Not Satisfiable',
'417': 'Expectation Failed',
'418': 'I\'m a teapot',
'422': 'Unprocessable Entity',
'423': 'Locked',
'424': 'Failed Dependency',
'425': 'Unordered Collection',
'426': 'Upgrade Required',
'500': 'Internal Server Error',
'501': 'Not Implemented',
'502': 'Bad Gateway',
'503': 'Service Unavailable',
'504': 'Gateway Time-out',
'505': 'HTTP Version not supported',
'506': 'Variant Also Negotiates',
'507': 'Insufficient Storage',
'509': 'Bandwidth Limit Exceeded',
'510': 'Not Extended' };
/*
* generic error
*
* e.g. missing rev information:
*
* { "stack": "Error: Document update conflict. at gen_err(error.js:14:43)",
* "message": "Document update conflict.",
* "error": "conflict",
* "http_code": 409,
* "namespace": "couch",
* "request": {
* "method": "PUT",
* "headers": {
* "content-type": "application/json",
* "accept": "application/json",
* "authorization": "BasicYWRtaW46YWRtaW4=",
* "content-length": 13
* },
* "body": {"foo": "baz"},
* "uri": "http://admin:admin@localhost: 5984/doc_up1/foo",
* "callback": [Function]
* }
* }
*
* extension on error to support more complex logic.
*
* @param {error:error|string} the error or a reason for the error
* @param {code:string} the recognizable error code
* @param {http_code:integer:optional} the http code from couchdb
* @param {request:object} the request that was made to couch
* @param {type:string} a namespace for the error, e.g. couch
*
* @return an augmented error that helps you know more than the stack trace
*/
function gen_err(error,code,request,http_code,type) {
if(!type) { type = http_code; http_code = null; }
if(!error) { error = new Error(STATUS_CODES[http_code] || "Unknown Error"); }
if(typeof http_code !== "number") { http_code = 500; }
if(typeof error === 'string') { error = new Error(error); }
error.error = code;
error.http_code = http_code;
error.namespace = type;
error.request = request;
return error;
}
exports.request_err = function (e,c,r,h) { return gen_err(e,c,r,h,"request");};
exports.couch_err = function (e,c,r,h) { return gen_err(e,c,r,h,"couch"); };