diff options
| author | Karl Seamon | 2011-07-29 18:32:30 -0400 |
|---|---|---|
| committer | Igor Minar | 2011-08-19 01:20:45 -0700 |
| commit | 4ec1d8ee86e3138fb91543ca0dca28463895c090 (patch) | |
| tree | 9f7fff13f177317ff15f8804789a44576a151908 /src/Browser.js | |
| parent | c37bfde9eb31556ee1eb146795b0c1f1504a4a26 (diff) | |
| download | angular.js-4ec1d8ee86e3138fb91543ca0dca28463895c090.tar.bz2 | |
feat($xhr,$resource): expose response headers in callbacks
all $xhr*, $resource and related mocks now have access to headers from
their callbacks
Diffstat (limited to 'src/Browser.js')
| -rw-r--r-- | src/Browser.js | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/src/Browser.js b/src/Browser.js index 2b2170e2..65d27448 100644 --- a/src/Browser.js +++ b/src/Browser.js @@ -84,7 +84,9 @@ function Browser(window, document, body, XHR, $log) { * @param {string} method Requested method (get|post|put|delete|head|json) * @param {string} url Requested url * @param {?string} post Post data to send (null if nothing to post) - * @param {function(number, string)} callback Function that will be called on response + * @param {function(number, string, function([string]))} callback Function that will be called on + * response. The third argument is a function that can be called to return a specified response + * header or an Object containing all headers (when called with no arguments). * @param {object=} header additional HTTP headers to send with XHR. * Standard headers are: * <ul> @@ -97,6 +99,8 @@ function Browser(window, document, body, XHR, $log) { * Send ajax request */ self.xhr = function(method, url, post, callback, headers) { + var parsedHeaders; + outstandingRequestCount ++; if (lowercase(method) == 'json') { var callbackId = ("angular_" + Math.random() + '_' + (idCounter++)).replace(/\d\./, ''); @@ -123,7 +127,34 @@ function Browser(window, document, body, XHR, $log) { if (xhr.readyState == 4) { // normalize IE bug (http://bugs.jquery.com/ticket/1450) var status = xhr.status == 1223 ? 204 : xhr.status || 200; - completeOutstandingRequest(callback, status, xhr.responseText); + completeOutstandingRequest(callback, status, xhr.responseText, function(header) { + header = lowercase(header); + + if (header) { + return parsedHeaders + ? parsedHeaders[header] || null + : xhr.getResponseHeader(header); + } else { + // Return an object containing each response header + parsedHeaders = {}; + + forEach(xhr.getAllResponseHeaders().split('\n'), function(line) { + var i = line.indexOf(':'), + key = lowercase(trim(line.substr(0, i))), + value = trim(line.substr(i + 1)); + + if (parsedHeaders[key]) { + // Combine repeated headers + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + parsedHeaders[key] += ', ' + value; + } else { + parsedHeaders[key] = value; + } + }); + + return parsedHeaders; + } + }); } }; xhr.send(post || ''); |
