From a7150f1256f2a97a931b3c0d16eab70f45e81cae Mon Sep 17 00:00:00 2001 From: bolasblack Date: Wed, 3 Jul 2013 15:51:05 +0800 Subject: feat($http): accept function as headers value So we can request with dynamic header value. module.factory('Res', [ '$resource' '$routeParams' 'globalConfig' function($resource, $routeParams, globalConfig) { resource('/url/:id', {id: "@id"}, { patch: { method: 'patch', headers: { 'Authorization': function() { return "token " + globalConfig.token; } } } }); }]); --- src/ng/http.js | 23 ++++++++++++++++++++++- test/ng/httpSpec.js | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/ng/http.js b/src/ng/http.js index 2b9c7475..d81b7912 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -535,7 +535,9 @@ function $HttpProvider() { * - **params** – `{Object.}` – Map of strings or objects which will be turned to * `?key1=value1&key2=value2` after the url. If the value is not a string, it will be JSONified. * - **data** – `{string|Object}` – Data to be sent as the request message data. - * - **headers** – `{Object}` – Map of strings representing HTTP headers to send to the server. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the header will + * not be sent. * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. * - **transformRequest** – `{function(data, headersGetter)|Array.}` – @@ -736,6 +738,10 @@ function $HttpProvider() { defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + // execute if header value is function + execHeaders(defHeaders); + execHeaders(reqHeaders); + // using for-in instead of forEach to avoid unecessary iteration after header has been found defaultHeadersIteration: for (defHeaderName in defHeaders) { @@ -751,6 +757,21 @@ function $HttpProvider() { } return reqHeaders; + + function execHeaders(headers) { + var headerContent; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(); + if (headerContent != null) { + headers[header] = headerContent; + } else { + delete headers[header]; + } + } + }); + } } } diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 8f2642f3..c21c6c23 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -784,6 +784,28 @@ describe('$http', function() { $httpBackend.flush(); })); + + it('should send execute result if header value is function', inject(function() { + var headerConfig = {'Accept': function() { return 'Rewritten'; }}; + + function checkHeaders(headers) { + return headers['Accept'] == 'Rewritten'; + } + + $httpBackend.expect('GET', '/url', undefined, checkHeaders).respond(''); + $httpBackend.expect('POST', '/url', undefined, checkHeaders).respond(''); + $httpBackend.expect('PUT', '/url', undefined, checkHeaders).respond(''); + $httpBackend.expect('PATCH', '/url', undefined, checkHeaders).respond(''); + $httpBackend.expect('DELETE', '/url', undefined, checkHeaders).respond(''); + + $http({url: '/url', method: 'GET', headers: headerConfig}); + $http({url: '/url', method: 'POST', headers: headerConfig}); + $http({url: '/url', method: 'PUT', headers: headerConfig}); + $http({url: '/url', method: 'PATCH', headers: headerConfig}); + $http({url: '/url', method: 'DELETE', headers: headerConfig}); + + $httpBackend.flush(); + })); }); -- cgit v1.2.3