diff options
| author | Igor Minar | 2012-01-04 09:21:05 -0800 |
|---|---|---|
| committer | Vojta Jina | 2012-01-09 13:17:48 -0800 |
| commit | 23f8da7cbb59c8f53f0f5c1e48102faeb4b7fd85 (patch) | |
| tree | c4bc429584921a90da3a9043e21a5dcfa50137e9 | |
| parent | b911e303ecad8b7b54589e26f3c551395bf47405 (diff) | |
| download | angular.js-23f8da7cbb59c8f53f0f5c1e48102faeb4b7fd85.tar.bz2 | |
feat($http): expose req/resp headers to transform fns
| -rw-r--r-- | src/service/http.js | 24 | ||||
| -rw-r--r-- | test/service/httpSpec.js | 53 |
2 files changed, 60 insertions, 17 deletions
diff --git a/src/service/http.js b/src/service/http.js index bd8e6e65..aee079b8 100644 --- a/src/service/http.js +++ b/src/service/http.js @@ -41,17 +41,17 @@ function parseHeaders(headers) { * - if called with single an argument returns a single header value or null * - if called with no arguments returns an object containing all headers. */ -function headersGetter(headersString) { - var headers = isObject(headersString) ? headersString : undefined; +function headersGetter(headers) { + var headersObj = isObject(headers) ? headers : undefined; return function(name) { - if (!headers) headers = parseHeaders(headersString); + if (!headersObj) headersObj = parseHeaders(headers); if (name) { - return headers[lowercase(name)] || null; + return headersObj[lowercase(name)] || null; } - return headers; + return headersObj; }; } @@ -62,16 +62,16 @@ function headersGetter(headersString) { * This function is used for both request and response transforming * * @param {*} data Data to transform. - * @param {function|Array.<function>} fns Function or an array of functions. - * @param {*=} param Optional parameter to be passed to all transform functions. + * @param {function(string=)} headers Http headers getter fn. + * @param {(function|Array.<function>)} fns Function or an array of functions. * @returns {*} Transformed data. */ -function transformData(data, fns, param) { +function transformData(data, headers, fns) { if (isFunction(fns)) - return fns(data); + return fns(data, headers); forEach(fns, function(fn) { - data = fn(data, param); + data = fn(data, headers); }); return data; @@ -172,10 +172,10 @@ function $HttpProvider() { var reqTransformFn = config.transformRequest || $config.transformRequest, respTransformFn = config.transformResponse || $config.transformResponse, - reqData = transformData(config.data, reqTransformFn), defHeaders = $config.headers, reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']}, defHeaders.common, defHeaders[lowercase(config.method)], config.headers), + reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn), promise; @@ -210,7 +210,7 @@ function $HttpProvider() { function transformResponse(response) { // make a copy since the response must be cacheable var resp = extend({}, response, { - data: transformData(response.data, respTransformFn, response.headers) + data: transformData(response.data, response.headers, respTransformFn) }); return (isSuccess(response.status)) ? resp diff --git a/test/service/httpSpec.js b/test/service/httpSpec.js index c1f8645e..5efe2954 100644 --- a/test/service/httpSpec.js +++ b/test/service/httpSpec.js @@ -567,6 +567,35 @@ describe('$http', function() { $http({method: 'POST', url: '/url', data: 'string-data'}); }); }); + + + it('should have access to request headers', function() { + $httpBackend.expect('POST', '/url', 'header1').respond(200); + $http.post('/url', 'req', { + headers: {h1: 'header1'}, + transformRequest: function(data, headers) { + return headers('h1'); + } + }).success(callback); + $httpBackend.flush(); + + expect(callback).toHaveBeenCalledOnce(); + }); + + + it('should pipeline more functions', function() { + function first(d, h) {return d + '-first' + ':' + h('h1')} + function second(d) {return uppercase(d)} + + $httpBackend.expect('POST', '/url', 'REQ-FIRST:V1').respond(200); + $http.post('/url', 'req', { + headers: {h1: 'v1'}, + transformRequest: [first, second] + }).success(callback); + $httpBackend.flush(); + + expect(callback).toHaveBeenCalledOnce(); + }); }); @@ -625,16 +654,30 @@ describe('$http', function() { }); + it('should have access to response headers', function() { + $httpBackend.expect('GET', '/url').respond(200, 'response', {h1: 'header1'}); + $http.get('/url', { + transformResponse: function(data, headers) { + return headers('h1'); + } + }).success(callback); + $httpBackend.flush(); + + expect(callback).toHaveBeenCalledOnce(); + expect(callback.mostRecentCall.args[0]).toBe('header1'); + }); + + it('should pipeline more functions', function() { - function first(d) {return d + '1';} - function second(d) {return d + '2';} + function first(d, h) {return d + '-first' + ':' + h('h1')} + function second(d) {return uppercase(d)} - $httpBackend.expect('POST', '/url').respond('0'); - $http({method: 'POST', url: '/url', transformResponse: [first, second]}).success(callback); + $httpBackend.expect('POST', '/url').respond(200, 'resp', {h1: 'v1'}); + $http.post('/url', '', {transformResponse: [first, second]}).success(callback); $httpBackend.flush(); expect(callback).toHaveBeenCalledOnce(); - expect(callback.mostRecentCall.args[0]).toBe('012'); + expect(callback.mostRecentCall.args[0]).toBe('RESP-FIRST:V1'); }); }); }); |
