Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit ad4336f

Browse files
committed
chore($http): remove deprecated responseInterceptors functionality
Code cleanup! response interceptors have been deprecated for some time, and it is confusing to have two APIs, one of which is slightly "hidden" and hard to see, which perform the same task. The newer API is a bit cleaner and more visible, so this is naturally preferred. BREAKING CHANGE: Previously, it was possible to register a response interceptor like so: // register the interceptor as a service $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { return function(promise) { return promise.then(function(response) { // do something on success return response; }, function(response) { // do something on error if (canRecover(response)) { return responseOrNewPromise } return $q.reject(response); }); } }); $httpProvider.responseInterceptors.push('myHttpInterceptor'); Now, one must use the newer API introduced in v1.1.4 (4ae4681), like so: $provide.factory('myHttpInterceptor', function($q) { return { response: function(response) { // do something on success return response; }, responseError: function(response) { // do something on error if (canRecover(response)) { return responseOrNewPromise } return $q.reject(response); } }; }); $httpProvider.interceptors.push('myHttpInterceptor'); More details on the new interceptors API (which has been around as of v1.1.4) can be found at https://docs.angularjs.org/api/ng/service/$http#interceptors Closes #7266 Closes #7267
1 parent 81147a8 commit ad4336f

File tree

2 files changed

+1
-193
lines changed

2 files changed

+1
-193
lines changed

src/ng/http.js

-72
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,6 @@ function $HttpProvider() {
126126
*/
127127
var interceptorFactories = this.interceptors = [];
128128

129-
/**
130-
* For historical reasons, response interceptors are ordered by the order in which
131-
* they are applied to the response. (This is the opposite of interceptorFactories)
132-
*/
133-
var responseInterceptorFactories = this.responseInterceptors = [];
134-
135129
this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
136130
function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
137131

@@ -149,27 +143,6 @@ function $HttpProvider() {
149143
? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
150144
});
151145

152-
forEach(responseInterceptorFactories, function(interceptorFactory, index) {
153-
var responseFn = isString(interceptorFactory)
154-
? $injector.get(interceptorFactory)
155-
: $injector.invoke(interceptorFactory);
156-
157-
/**
158-
* Response interceptors go before "around" interceptors (no real reason, just
159-
* had to pick one.) But they are already reversed, so we can't use unshift, hence
160-
* the splice.
161-
*/
162-
reversedInterceptors.splice(index, 0, {
163-
response: function(response) {
164-
return responseFn($q.when(response));
165-
},
166-
responseError: function(response) {
167-
return responseFn($q.reject(response));
168-
}
169-
});
170-
});
171-
172-
173146
/**
174147
* @ngdoc service
175148
* @kind function
@@ -422,51 +395,6 @@ function $HttpProvider() {
422395
* });
423396
* ```
424397
*
425-
* # Response interceptors (DEPRECATED)
426-
*
427-
* Before you start creating interceptors, be sure to understand the
428-
* {@link ng.$q $q and deferred/promise APIs}.
429-
*
430-
* For purposes of global error handling, authentication or any kind of synchronous or
431-
* asynchronous preprocessing of received responses, it is desirable to be able to intercept
432-
* responses for http requests before they are handed over to the application code that
433-
* initiated these requests. The response interceptors leverage the {@link ng.$q
434-
* promise apis} to fulfil this need for both synchronous and asynchronous preprocessing.
435-
*
436-
* The interceptors are service factories that are registered with the $httpProvider by
437-
* adding them to the `$httpProvider.responseInterceptors` array. The factory is called and
438-
* injected with dependencies (if specified) and returns the interceptor — a function that
439-
* takes a {@link ng.$q promise} and returns the original or a new promise.
440-
*
441-
* ```js
442-
* // register the interceptor as a service
443-
* $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
444-
* return function(promise) {
445-
* return promise.then(function(response) {
446-
* // do something on success
447-
* return response;
448-
* }, function(response) {
449-
* // do something on error
450-
* if (canRecover(response)) {
451-
* return responseOrNewPromise
452-
* }
453-
* return $q.reject(response);
454-
* });
455-
* }
456-
* });
457-
*
458-
* $httpProvider.responseInterceptors.push('myHttpInterceptor');
459-
*
460-
*
461-
* // register the interceptor via an anonymous factory
462-
* $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
463-
* return function(promise) {
464-
* // same as above
465-
* }
466-
* });
467-
* ```
468-
*
469-
*
470398
* # Security Considerations
471399
*
472400
* When designing web applications, consider security threats from:

test/ng/httpSpec.js

+1-121
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,6 @@ describe('$http', function() {
2828

2929
describe('$httpProvider', function() {
3030
describe('interceptors', function() {
31-
it('should accept injected rejected response interceptor', function() {
32-
var wasCalled = false;
33-
module(function($httpProvider, $provide) {
34-
$httpProvider.responseInterceptors.push('injectedInterceptor');
35-
$provide.factory('injectedInterceptor', ['$q', function($q) {
36-
return function(promise) {
37-
return promise.then(null, function authInterceptor(response) {
38-
wasCalled = true;
39-
expect(response.status).toEqual(401);
40-
return $q.reject(response);
41-
});
42-
};
43-
}]);
44-
});
45-
inject(function($http, $httpBackend) {
46-
$httpBackend.expect('GET', '/url').respond(401);
47-
$http({method: 'GET', url: '/url'});
48-
$httpBackend.flush();
49-
expect(wasCalled).toEqual(true);
50-
});
51-
});
52-
53-
5431
it('should chain request, requestReject, response and responseReject interceptors', function() {
5532
module(function($httpProvider) {
5633
var savedConfig, savedResponse;
@@ -128,28 +105,6 @@ describe('$http', function() {
128105
}
129106
};
130107
});
131-
$httpProvider.responseInterceptors.push(function($q) {
132-
return function(promise) {
133-
var defer = $q.defer();
134-
135-
promise.then(function(response) {
136-
response.data = '[' + response.data + '] legacy-1';
137-
defer.resolve(response);
138-
});
139-
return defer.promise;
140-
};
141-
});
142-
$httpProvider.responseInterceptors.push(function($q) {
143-
return function(promise) {
144-
var defer = $q.defer();
145-
146-
promise.then(function(response) {
147-
response.data = '[' + response.data + '] legacy-2';
148-
defer.resolve(response);
149-
});
150-
return defer.promise;
151-
};
152-
});
153108
});
154109
inject(function($http, $httpBackend) {
155110
var response;
@@ -158,82 +113,7 @@ describe('$http', function() {
158113
response = r;
159114
});
160115
$httpBackend.flush();
161-
expect(response.data).toEqual('{{[[response] legacy-1] legacy-2} inner} outer');
162-
});
163-
});
164-
});
165-
166-
167-
describe('response interceptors', function() {
168-
169-
it('should default to an empty array', module(function($httpProvider) {
170-
expect($httpProvider.responseInterceptors).toEqual([]);
171-
}));
172-
173-
174-
it('should pass the responses through interceptors', function() {
175-
module(function($httpProvider, $provide) {
176-
$provide.factory('testInterceptor', function ($q) {
177-
return function(httpPromise) {
178-
return httpPromise.then(function(response) {
179-
var deferred = $q.defer();
180-
deferred.resolve({
181-
data: response.data + '?',
182-
status: 209,
183-
headers: response.headers,
184-
request: response.config
185-
});
186-
return deferred.promise;
187-
});
188-
};
189-
});
190-
// just change the response data and pass the response object along
191-
$httpProvider.responseInterceptors.push(function() {
192-
return function(httpPromise) {
193-
return httpPromise.then(function(response) {
194-
response.data += '!';
195-
return response;
196-
});
197-
};
198-
});
199-
200-
// return a new resolved promise representing modified response object
201-
$httpProvider.responseInterceptors.push('testInterceptor');
202-
});
203-
inject(function($http, $httpBackend) {
204-
$httpBackend.expect('GET', '/foo').respond(201, 'Hello');
205-
$http.get('/foo').success(function(data, status) {
206-
expect(data).toBe('Hello!?');
207-
expect(status).toBe(209);
208-
callback();
209-
});
210-
$httpBackend.flush();
211-
expect(callback).toHaveBeenCalledOnce();
212-
});
213-
});
214-
215-
216-
it('should support interceptors defined as services', function() {
217-
module(function($provide, $httpProvider) {
218-
$provide.factory('myInterceptor', function() {
219-
return function(promise) {
220-
return promise.then(function(response) {
221-
response.data = uppercase(response.data);
222-
return response;
223-
});
224-
};
225-
});
226-
$httpProvider.responseInterceptors.push('myInterceptor');
227-
});
228-
inject(function($http, $httpBackend) {
229-
var response;
230-
231-
$httpBackend.expect('GET', '/test').respond('hello!');
232-
$http.get('/test').success(function(data) {response = data;});
233-
expect(response).toBeUndefined();
234-
235-
$httpBackend.flush();
236-
expect(response).toBe('HELLO!');
116+
expect(response.data).toEqual('{{response} inner} outer');
237117
});
238118
});
239119
});

0 commit comments

Comments
 (0)