Skip to content

Commit

Permalink
Ajax: Don't throw exceptions on binary data response
Browse files Browse the repository at this point in the history
Fixes gh-2498
Closes gh-2682

The added unit test shows how this could be used to support an
ArrayBuffer return, but $.ajax does not support it natively.
The goal with this change was to avoid the exception.
  • Loading branch information
dmethvin committed Nov 4, 2015
1 parent 76e9a95 commit 769446c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
13 changes: 7 additions & 6 deletions src/ajax/xhr.js
Expand Up @@ -97,12 +97,13 @@ jQuery.ajaxTransport( function( options ) {
xhrSuccessStatus[ xhr.status ] || xhr.status,
xhr.statusText,

// Support: IE9
// Accessing binary-data responseText throws an exception
// (#11426)
typeof xhr.responseText === "string" ? {
text: xhr.responseText
} : undefined,
// Support: IE9 only
// IE9 has no XHR2 but throws on binary (trac-11426)
// For XHR2 non-text, let the caller handle it (gh-2498)
( xhr.responseType || "text" ) !== "text" ||
typeof xhr.responseText !== "string" ?
{ binary: xhr.response } :
{ text: xhr.responseText },
xhr.getAllResponseHeaders()
);
}
Expand Down
24 changes: 24 additions & 0 deletions test/unit/ajax.js
Expand Up @@ -1660,6 +1660,30 @@ QUnit.module( "ajax", {
};
} );

if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().responseType !== "string" ) {

QUnit.skip( "No ArrayBuffer support in XHR", jQuery.noop );
} else {

// No built-in support for binary data, but it's easy to add via a prefilter
jQuery.ajaxPrefilter( "arraybuffer", function ( s ) {
s.xhrFields = { responseType: "arraybuffer" };
s.responseFields.arraybuffer = "response";
s.converters[ "binary arraybuffer" ] = true;
});

ajaxTest( "gh-2498 - jQuery.ajax() - binary data shouldn't throw an exception", 2, function( assert ) {
return {
url: url( "data/1x1.jpg" ),
dataType: "arraybuffer",
success: function( data, s, jqxhr ) {
assert.ok( data instanceof window.ArrayBuffer, "correct data type" );
assert.ok( jqxhr.response instanceof window.ArrayBuffer, "data in jQXHR" );
}
};
} );
}

QUnit.asyncTest( "#11743 - jQuery.ajax() - script, throws exception", 1, function( assert ) {

// Support: Android 2.3 only
Expand Down

0 comments on commit 769446c

Please sign in to comment.