aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Minar2011-11-30 03:58:34 -0500
committerIgor Minar2011-11-30 14:49:35 -0500
commit188bdf7768c9594a01a18abae3fa9a3114802508 (patch)
tree01116c84c9985f284a7530fa6a15fd8e27453d1b
parentdbd880cc0a9521bd5b9c96ca3f052450c3def336 (diff)
downloadangular.js-188bdf7768c9594a01a18abae3fa9a3114802508.tar.bz2
feat($http): add response interceptors
-rw-r--r--src/service/http.js6
-rw-r--r--test/service/httpSpec.js45
2 files changed, 51 insertions, 0 deletions
diff --git a/src/service/http.js b/src/service/http.js
index 5666f486..bdf55937 100644
--- a/src/service/http.js
+++ b/src/service/http.js
@@ -81,6 +81,8 @@ function $HttpProvider() {
}
};
+ var responseInterceptors = this.responseInterceptors = [];
+
this.$get = ['$httpBackend', '$browser', '$exceptionHandler', '$cacheFactory', '$rootScope', '$q',
function($httpBackend, $browser, $exceptionHandler, $cacheFactory, $rootScope, $q) {
@@ -129,6 +131,10 @@ function $HttpProvider() {
deferredResp = $q.defer(),
promise = deferredResp.promise;
+ forEach(responseInterceptors, function(interceptor) {
+ promise = interceptor(promise);
+ });
+
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
diff --git a/test/service/httpSpec.js b/test/service/httpSpec.js
index 63c1f529..3e388a43 100644
--- a/test/service/httpSpec.js
+++ b/test/service/httpSpec.js
@@ -31,6 +31,51 @@ describe('$http', function() {
}));
+ describe('$httpProvider', function() {
+
+ describe('interceptors', function() {
+
+ it('should default to an empty array', inject(function($httpProvider) {
+ expect($httpProvider.responseInterceptors).toEqual([]);
+ }));
+
+
+ it('should pass the responses through interceptors', inject(function($httpProvider, $q) {
+ // just change the response data and pass the response object along
+ $httpProvider.responseInterceptors.push(function(httpPromise) {
+ return httpPromise.then(function(response) {
+ response.data += '!';
+ return response;
+ });
+ });
+
+ // return a new resolved promise representing modified response object
+ $httpProvider.responseInterceptors.push(function(httpPromise) {
+ return httpPromise.then(function(response) {
+ var deferred = $q.defer();
+ deferred.resolve({
+ data: response.data + '?',
+ status: 209,
+ headers: response.headers,
+ config: response.config
+ });
+ return deferred.promise;
+ });
+ });
+ }, function($http, $httpBackend) {
+ $httpBackend.expect('GET', '/foo').respond(201, 'Hello');
+ $http.get('/foo').success(function(data, status) {
+ expect(data).toBe('Hello!?');
+ expect(status).toBe(209);
+ callback();
+ })
+ $httpBackend.flush();
+ expect(callback).toHaveBeenCalledOnce();
+ }));
+ });
+ });
+
+
it('should do basic request', function() {
$httpBackend.expect('GET', '/url').respond('');
$http({url: '/url', method: 'GET'});