aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/http.js9
-rw-r--r--test/ng/httpSpec.js71
2 files changed, 78 insertions, 2 deletions
diff --git a/src/ng/http.js b/src/ng/http.js
index 99c1fff3..e4d695c4 100644
--- a/src/ng/http.js
+++ b/src/ng/http.js
@@ -306,6 +306,9 @@ function $HttpProvider() {
* cache, but the cache is not populated yet, only one request to the server will be made and
* the remaining requests will be fulfilled using the response for the first request.
*
+ * A custom default cache built with $cacheFactory can be provided in $http.defaults.cache.
+ * To skip it, set configuration property `cache` to `false`.
+ *
*
* # Response interceptors
*
@@ -733,8 +736,10 @@ function $HttpProvider() {
promise.then(removePendingReq, removePendingReq);
- if (config.cache && config.method == 'GET') {
- cache = isObject(config.cache) ? config.cache : defaultCache;
+ if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {
+ cache = isObject(config.cache) ? config.cache
+ : isObject(defaults.cache) ? defaults.cache
+ : defaultCache;
}
if (cache) {
diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js
index 600a6a2e..2dd14192 100644
--- a/test/ng/httpSpec.js
+++ b/test/ng/httpSpec.js
@@ -923,6 +923,77 @@ describe('$http', function() {
expect(callback).toHaveBeenCalledOnce();
})
);
+
+ describe('$http.defaults.cache', function () {
+
+ it('should be undefined by default', function() {
+ expect($http.defaults.cache).toBeUndefined()
+ });
+
+ it('should cache requests when no cache given in request config', function() {
+ $http.defaults.cache = cache;
+
+ // First request fills the cache from server response.
+ $httpBackend.expect('GET', '/url').respond(200, 'content');
+ $http({method: 'GET', url: '/url'}); // Notice no cache given in config.
+ $httpBackend.flush();
+
+ // Second should be served from cache, without sending request to server.
+ $http({method: 'get', url: '/url'}).success(callback);
+ $rootScope.$digest();
+
+ expect(callback).toHaveBeenCalledOnce();
+ expect(callback.mostRecentCall.args[0]).toBe('content');
+
+ // Invalidate cache entry.
+ $http.defaults.cache.remove("/url");
+
+ // After cache entry removed, a request should be sent to server.
+ $httpBackend.expect('GET', '/url').respond(200, 'content');
+ $http({method: 'GET', url: '/url'});
+ $httpBackend.flush();
+ });
+
+ it('should have less priority than explicitly given cache', inject(function($cacheFactory) {
+ var localCache = $cacheFactory('localCache');
+ $http.defaults.cache = cache;
+
+ // Fill local cache.
+ $httpBackend.expect('GET', '/url').respond(200, 'content-local-cache');
+ $http({method: 'GET', url: '/url', cache: localCache});
+ $httpBackend.flush();
+
+ // Fill default cache.
+ $httpBackend.expect('GET', '/url').respond(200, 'content-default-cache');
+ $http({method: 'GET', url: '/url'});
+ $httpBackend.flush();
+
+ // Serve request from default cache when no local given.
+ $http({method: 'get', url: '/url'}).success(callback);
+ $rootScope.$digest();
+ expect(callback).toHaveBeenCalledOnce();
+ expect(callback.mostRecentCall.args[0]).toBe('content-default-cache');
+ callback.reset();
+
+ // Serve request from local cache when it is given (but default filled too).
+ $http({method: 'get', url: '/url', cache: localCache}).success(callback);
+ $rootScope.$digest();
+ expect(callback).toHaveBeenCalledOnce();
+ expect(callback.mostRecentCall.args[0]).toBe('content-local-cache');
+ }));
+
+ it('should be skipped if {cache: false} is passed in request config', function() {
+ $http.defaults.cache = cache;
+
+ $httpBackend.expect('GET', '/url').respond(200, 'content');
+ $http({method: 'GET', url: '/url'});
+ $httpBackend.flush();
+
+ $httpBackend.expect('GET', '/url').respond();
+ $http({method: 'GET', url: '/url', cache: false});
+ $httpBackend.flush();
+ });
+ });
});