Permalink
Browse files

Battle hardened error.js

  • Loading branch information...
1 parent 6662e8c commit 78191bca8a6c2cecd2715aa21a018fb406cb85bf @dscape committed Aug 19, 2011
Showing with 98 additions and 4 deletions.
  1. +56 −1 error.js
  2. +1 −2 nano.js
  3. +1 −1 package.json
  4. +40 −0 tests/err/error.js
View
@@ -1,3 +1,55 @@
+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
*
@@ -33,8 +85,11 @@
* @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); }
- if(!type) { type = http_code; http_code = 500; }
+
error.error = code;
error.http_code = http_code;
error.namespace = type;
View
@@ -95,8 +95,7 @@ module.exports = exports = nano = function database_module(cfg) {
if(e) { return callback(error.request_err(e,"socket",req,status_code),{},b); }
rh = h.headers;
status_code = h.statusCode;
- // did we get json or binary?
- try { parsed = JSON.parse(b); } catch (err) { parsed = b; }
+ try { parsed = JSON.parse(b); } catch (err) { parsed = b; } // did we get json or binary?
if (status_code >= 200 && status_code < 300) {
callback(null,rh,parsed);
}
View
@@ -1,7 +1,7 @@
{ "name": "nano"
, "description": "minimalistic couchdb driver for node.js"
, "homepage": "http://github.com/dscape/nano"
-, "version": "0.5.3"
+, "version": "0.5.4"
, "author": "Nuno Job <nunojobpinto@gmail.com> (http://nunojob.com)"
, "keywords": ["couchdb", "data", "request", "json", "nosql", "micro", "nano"]
, "dependencies": {"request": "~2.0.4", "underscore": "~1.1.7"}
View
@@ -0,0 +1,40 @@
+var vows = require('vows')
+ , assert = require('assert')
+ , err = require('../../error');
+
+/*****************************************************************************
+ * empty_error *
+ *****************************************************************************/
+function empty_error(callback) {
+ callback(null,err.couch_err(null,null,null,null));
+}
+
+function empty_error_ok(_,e) {
+ assert.equal(e.message, "Unknown Error");
+ assert.equal(e.http_code, 500);
+ assert.isNull(e.error);
+ assert.isNull(e.request);
+}
+
+/*****************************************************************************
+ * error_412 *
+ *****************************************************************************/
+function error_412(callback) {
+ callback(null,err.couch_err(null,null,null,412));
+}
+
+function error_412_ok(_,e) {
+ assert.equal(e.message, "Precondition Failed");
+ assert.equal(e.http_code, 412);
+ assert.isNull(e.error);
+ assert.isNull(e.request);
+}
+
+vows.describe('error').addBatch({
+ "empty_error": {
+ topic: function () { empty_error(this.callback); }
+ , "=": empty_error_ok },
+ "error_412": {
+ topic: function () { error_412(this.callback); }
+ , "=": error_412_ok }
+}).exportTo(module);

0 comments on commit 78191bc

Please sign in to comment.