diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index d19a1d6a6aee..4370e3a6a916 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -36,8 +36,8 @@ * @param {Object.=} actions Hash with declaration of custom action that should extend the * default set of resource actions. The declaration should be created in the following format: * - * {action1: {method:?, params:?, isArray:?}, - * action2: {method:?, params:?, isArray:?}, + * {action1: {method:?, params:?, isArray:?, headers:?}, + * action2: {method:?, params:?, isArray:?, headers:?}, * ...} * * Where: @@ -49,6 +49,7 @@ * - `params` – {object=} – Optional set of pre-bound parameters for this action. * - isArray – {boolean=} – If true then the returned object for this action is an array, see * `returns` section. + * - `headers` – {object=} – Optional HTTP headers to send * * @returns {Object} A resource "class" object with methods for the default set of resource actions * optionally extended with custom `actions`. The default set contains these actions: @@ -130,7 +131,7 @@ * The object returned from this function execution is a resource "class" which has "static" method * for each action in the definition. * - * Calling these methods invoke `$http` on the `url` template with the given `method` and `params`. + * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and `headers`. * When the data is returned from the server then the object is an instance of the resource type and * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD * operations (create, read, update, delete) on server-side data. @@ -362,7 +363,8 @@ angular.module('ngResource', ['ng']). $http({ method: action.method, url: route.url(extend({}, extractParams(data), action.params || {}, params)), - data: data + data: data, + headers: extend({}, action.headers || {}) }).then(function(response) { var data = response.data; @@ -417,4 +419,4 @@ angular.module('ngResource', ['ng']). } return ResourceFactory; - }]); + }]); \ No newline at end of file diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 2981732c9683..8f7239155178 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -14,7 +14,14 @@ describe("resource", function() { }, patch: { method: 'PATCH' + }, + conditionalPut: { + method: 'PUT', + headers: { + 'If-None-Match': '*' + } } + }); callback = jasmine.createSpy(); })); @@ -56,7 +63,6 @@ describe("resource", function() { R.get({a:4, b:5, c:6}); }); - it('should support escaping colons in url template', function() { var R = $resource('http://localhost\\:8080/Path/:a/\\:stillPath/:b'); @@ -145,7 +151,14 @@ describe("resource", function() { expect(callback.mostRecentCall.args[1]()).toEqual({}); }); - + it('should send correct headers', function() { + $httpBackend.expectPUT('/CreditCard/123', undefined, function(headers) { + return headers['If-None-Match'] == "*"; + }).respond({id:123}); + + CreditCard.conditionalPut({id: {key:123}}); + }); + it("should read partial resource", function() { $httpBackend.expect('GET', '/CreditCard').respond([{id:{key:123}}]); var ccs = CreditCard.query(); @@ -340,4 +353,4 @@ describe("resource", function() { expect(callback).not.toHaveBeenCalled(); }); }); -}); +}); \ No newline at end of file