diff options
| -rw-r--r-- | src/service/http.js | 6 | ||||
| -rw-r--r-- | test/service/httpSpec.js | 45 |
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'}); |
