aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Lal <james@lightsofapollo.com>2013-05-10 17:33:00 -0700
committerJames Lal <james@lightsofapollo.com>2013-05-10 17:33:00 -0700
commit09d9ad3f92edec992bd1ab2e6a1c505f16bf22de (patch)
treed8c5b306760c9de5359aafe428753a4f3326c7a5
parent9b5dd29c45ea08ff362198ffb984492df1ebadb1 (diff)
parent5f35b858c31d455894f3c700eade1d1ca0ca4d3a (diff)
downloadjsCalDAV-09d9ad3f92edec992bd1ab2e6a1c505f16bf22de.tar.gz
Merge pull request #17 from lightsofapollo/asset-http-status-checks
Rework http error validation so it can be reused r=kgrandon
-rw-r--r--caldav.js62
-rw-r--r--lib/caldav/http/basic_auth.js3
-rw-r--r--lib/caldav/http/oauth2.js2
-rw-r--r--lib/caldav/request/abstract.js29
-rw-r--r--lib/caldav/xhr.js28
-rw-r--r--test/caldav/request/asset_test.js29
6 files changed, 87 insertions, 66 deletions
diff --git a/caldav.js b/caldav.js
index 6947e17..6f43d34 100644
--- a/caldav.js
+++ b/caldav.js
@@ -2107,6 +2107,7 @@ function write (chunk) {
*/
(function(module, ns) {
var Native;
+ var Errors = ns.require('errors');
if (typeof(window) === 'undefined') {
Native = require('xmlhttprequest').XMLHttpRequest;
@@ -2114,6 +2115,19 @@ function write (chunk) {
Native = window.XMLHttpRequest;
}
+ function determineHttpStatusError(status) {
+ var message = 'Cannot handle request due to server response';
+ var err = 'Unknown';
+
+ if (status === 500)
+ err = 'ServerFailure';
+
+ if (status === 401)
+ err = 'Authentication';
+
+ return new Errors[err](message);
+ }
+
/**
* Creates a XHR wrapper.
* Depending on the platform this is loaded
@@ -2155,6 +2169,7 @@ function write (chunk) {
password: null,
url: null,
streaming: true,
+ validateStatus: false,
headers: {},
data: null,
@@ -2272,7 +2287,18 @@ function write (chunk) {
}
this.waiting = false;
- callback(null, this.xhr);
+
+ if (
+ !this.validateStatus ||
+ (
+ this.xhr.status > 199 &&
+ this.xhr.status < 300
+ )
+ ) {
+ return callback(null, this.xhr);
+ }
+
+ callback(determineHttpStatusError(this.xhr.status), this.xhr);
}
}.bind(this));
@@ -2581,7 +2607,8 @@ function write (chunk) {
}
BasicAuth.prototype = {
- __proto__: XHR.prototype
+ __proto__: XHR.prototype,
+ validateStatus: true
};
@@ -2640,6 +2667,8 @@ function write (chunk) {
Oauth2.prototype = {
__proto__: XHR.prototype,
+ validateStatus: true,
+
_sendXHR: function(xhr) {
xhr.setRequestHeader(
'Authorization', 'Bearer ' + this.connection.oauth.access_token
@@ -3166,20 +3195,6 @@ function write (chunk) {
var SAX = ns.require('sax');
var XHR = ns.require('xhr');
- var Errors = ns.require('errors');
-
- function determineHttpStatusError(status) {
- var message = 'Cannot handle request due to server response';
- var err = 'Unknown';
-
- if (status === 500)
- err = 'ServerFailure';
-
- if (status === 401)
- err = 'Authentication';
-
- return new Errors[err](message);
- }
/**
* Creates an (Web/Cal)Dav request.
@@ -3249,19 +3264,8 @@ function write (chunk) {
return callback(err);
}
- // handle the success case
- if (xhr.status > 199 && xhr.status < 300) {
- self.sax.close();
- return self._processResult(req, callback);
- }
-
- // probable error cases
- callback(
- determineHttpStatusError(xhr.status),
- xhr
- );
-
-
+ self.sax.close();
+ return self._processResult(req, callback);
});
return req;
diff --git a/lib/caldav/http/basic_auth.js b/lib/caldav/http/basic_auth.js
index 07f083d..5b9f666 100644
--- a/lib/caldav/http/basic_auth.js
+++ b/lib/caldav/http/basic_auth.js
@@ -19,7 +19,8 @@
}
BasicAuth.prototype = {
- __proto__: XHR.prototype
+ __proto__: XHR.prototype,
+ validateStatus: true
};
diff --git a/lib/caldav/http/oauth2.js b/lib/caldav/http/oauth2.js
index 75e6334..8b3b9e5 100644
--- a/lib/caldav/http/oauth2.js
+++ b/lib/caldav/http/oauth2.js
@@ -44,6 +44,8 @@
Oauth2.prototype = {
__proto__: XHR.prototype,
+ validateStatus: true,
+
_sendXHR: function(xhr) {
xhr.setRequestHeader(
'Authorization', 'Bearer ' + this.connection.oauth.access_token
diff --git a/lib/caldav/request/abstract.js b/lib/caldav/request/abstract.js
index 6f33af4..acc91cc 100644
--- a/lib/caldav/request/abstract.js
+++ b/lib/caldav/request/abstract.js
@@ -2,20 +2,6 @@
var SAX = ns.require('sax');
var XHR = ns.require('xhr');
- var Errors = ns.require('errors');
-
- function determineHttpStatusError(status) {
- var message = 'Cannot handle request due to server response';
- var err = 'Unknown';
-
- if (status === 500)
- err = 'ServerFailure';
-
- if (status === 401)
- err = 'Authentication';
-
- return new Errors[err](message);
- }
/**
* Creates an (Web/Cal)Dav request.
@@ -85,19 +71,8 @@
return callback(err);
}
- // handle the success case
- if (xhr.status > 199 && xhr.status < 300) {
- self.sax.close();
- return self._processResult(req, callback);
- }
-
- // probable error cases
- callback(
- determineHttpStatusError(xhr.status),
- xhr
- );
-
-
+ self.sax.close();
+ return self._processResult(req, callback);
});
return req;
diff --git a/lib/caldav/xhr.js b/lib/caldav/xhr.js
index 6c8351f..42e0c32 100644
--- a/lib/caldav/xhr.js
+++ b/lib/caldav/xhr.js
@@ -3,6 +3,7 @@
*/
(function(module, ns) {
var Native;
+ var Errors = ns.require('errors');
if (typeof(window) === 'undefined') {
Native = require('xmlhttprequest').XMLHttpRequest;
@@ -10,6 +11,19 @@
Native = window.XMLHttpRequest;
}
+ function determineHttpStatusError(status) {
+ var message = 'Cannot handle request due to server response';
+ var err = 'Unknown';
+
+ if (status === 500)
+ err = 'ServerFailure';
+
+ if (status === 401)
+ err = 'Authentication';
+
+ return new Errors[err](message);
+ }
+
/**
* Creates a XHR wrapper.
* Depending on the platform this is loaded
@@ -51,6 +65,7 @@
password: null,
url: null,
streaming: true,
+ validateStatus: false,
headers: {},
data: null,
@@ -168,7 +183,18 @@
}
this.waiting = false;
- callback(null, this.xhr);
+
+ if (
+ !this.validateStatus ||
+ (
+ this.xhr.status > 199 &&
+ this.xhr.status < 300
+ )
+ ) {
+ return callback(null, this.xhr);
+ }
+
+ callback(determineHttpStatusError(this.xhr.status), this.xhr);
}
}.bind(this));
diff --git a/test/caldav/request/asset_test.js b/test/caldav/request/asset_test.js
index 3f9ebcd..f1878ba 100644
--- a/test/caldav/request/asset_test.js
+++ b/test/caldav/request/asset_test.js
@@ -6,6 +6,7 @@ suite('caldav/request/asset.js', function() {
// classes
var Asset;
var Xhr;
+ var Errors;
var Connection;
var SAX;
var FakeXhr;
@@ -29,6 +30,7 @@ suite('caldav/request/asset.js', function() {
FakeXhr = Caldav.require('support/fake_xhr');
Xhr = Caldav.require('xhr');
Connection = Caldav.require('connection');
+ Errors = Caldav.require('errors');
oldXhrClass = Xhr.prototype.xhrClass;
Xhr.prototype.xhrClass = FakeXhr;
@@ -82,17 +84,28 @@ suite('caldav/request/asset.js', function() {
});
- test('#put', function(done) {
- var content = 'foo';
+ suite('#put', function() {
+ test('with error', function() {
+ subject.put({}, '', function(err) {
+ assert.ok(err, 'returns error');
+ assert.instanceOf(err, Errors.Authentication, 'assets validate http');
+ });
- subject.put({ etag: 'x' }, content, function(err, data, xhr) {
- assert.equal(xhr.openArgs[0], 'PUT');
- assert.equal(xhr.sendArgs[0], content);
- done();
+ var xhr = lastXHR();
+ xhr.respond('', 401);
});
- var xhr = lastXHR();
- xhr.respond('', 201);
+ test('success', function(done) {
+ var content = 'foo';
+ subject.put({ etag: 'x' }, content, function(err, data, xhr) {
+ assert.equal(xhr.openArgs[0], 'PUT');
+ assert.equal(xhr.sendArgs[0], content);
+ done();
+ });
+
+ var xhr = lastXHR();
+ xhr.respond('', 201);
+ });
});
test('#delete', function(done) {