$http always transform response content '[abc}' to JSON even we already set resp content type as 'application/octet-stream' #10349
Description
As title, we ran into this issue when we try to get blob content from azure, using $http.get(url).then();
. Angular would throw exception "Syntax error: Invalid ...". Seems Angular always try to render our blob content as JSON. After reading code in /src/ng/http.js, I think I may know why.
var APPLICATION_JSON = 'application/json';
var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
var JSON_START = /^\s*(\[|\{[^\{])/;
var JSON_END = /[\}\]]\s*$/;
var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
function defaultHttpResponseTransform(data, headers) {
if (isString(data)) {
// strip json vulnerability protection prefix
data = data.replace(JSON_PROTECTION_PREFIX, '');
var contentType = headers('Content-Type');
if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0 && data.trim()) ||
(JSON_START.test(data) && JSON_END.test(data))) {
data = fromJson(data);
}
}
return data;
}
In this piece of code, $http
will try to detect response's content. If the contentType
is equal to application/json
, $http will transform the content to JSON object then return to users. It does make sense.
But if the contentType
is not application/json
, it would use (JSON_START.test(data) && JSON_END.test(data))
to identify whether the content is a JSON object. This is not accurate and not intuitive either. A string starts/ends with '[ { ] }' doesn't mean it's JSON, you can't even say it's like JSON.
For example, when you are writing a markdown article, maye API document, you may write a piece of content like below:
[link](some links...)
function bar:
function bar() {
if (a > b) {
foo()'
}
}
Obviously, it's not JSON while (JSON_START.test(data) && JSON_END.test(data)
will return true. This kind of RegEx is weak.
BTW, if users set response content-type explicitly, like application/octet-stream
or application/text-HTML
, it means yeah I know I am returning you a byte array or a piece of HTML. But AngularJS still try to transform it to JSON, and booom, throw an exception...
For now I can only set the response type while making ajax calls: $http.get(url, {responseType: byteArray})
. Can we remove this RegEx check and give users less bother like Jquery does?