//Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions,
- dataType /* internal */, tested /* internal */ ) {
+ dataType /* internal */, inspected /* internal */ ) {
dataType = dataType || options.dataTypes[ 0 ];
- tested = tested || {};
+ inspected = inspected || {};
- tested[ dataType ] = true;
+ inspected[ dataType ] = true;
var list = structure[ dataType ],
i = 0,
length = list ? list.length : 0,
- executeOnly = structure === prefilters,
- selected;
-
- for(; i < length && !( executeOnly ? typeof selected === "string" && !tested[ selected ] : selected ); i++ ) {
- selected = list[ i ]( options, originalOptions );
+ executeOnly = ( structure === prefilters ),
+ selection;
+
+ for(; i < length && ( executeOnly || !selection ); i++ ) {
+ selection = list[ i ]( options, originalOptions );
+ // If we got redirected to another dataType
+ // we try there if not done already
+ if ( typeof selection === "string" ) {
+ if ( inspected[ selection ] ) {
+ selection = undefined;
+ } else {
+ options.dataTypes.unshift( selection );
+ selection = inspectPrefiltersOrTransports(
+ structure, options, originalOptions, selection, inspected );
+ }
+ }
}
- // If we got redirected to another dataType
- // we try there
- if ( typeof selected === "string" && !tested[ selected ] ) {
- options.dataTypes.unshift( selected );
- selected = inspectPrefiltersOrTransports(
- structure, options, originalOptions, selected, tested );
-
// If we're only executing or nothing was selected
// we try the catchall dataType if not done already
- } else if ( ( executeOnly || !selected ) && !tested[ "*" ] ) {
- selected = inspectPrefiltersOrTransports(
- structure, options, originalOptions, "*" ,tested );
+ if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+ selection = inspectPrefiltersOrTransports(
+ structure, options, originalOptions, "*", inspected );
}
// unnecessary when only executing (prefilters)
// but it'll be ignored by the caller in that case
- return selected;
+ return selection;
}
jQuery.fn.extend({
// Cancel the request
abort: function( statusText ) {
+ statusText = statusText || "abort";
if ( transport ) {
- transport.abort( statusText || "abort" );
+ transport.abort( statusText );
}
done( 0, statusText );
return this;
var isSuccess,
success,
- error = ( statusText = statusText || "error" ),
+ error,
response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined,
lastModified,
etag;
error = "" + e;
}
}
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if( status ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
}
// Set data for the fake xhr object
// If no transport, we auto-abort
if ( !transport ) {
- done( 0, "notransport" );
+ done( -1, "No Transport" );
} else {
// Set state as sending
state = jXHR.readyState = 1;
transport.send( requestHeaders, done );
} catch (e) {
// Propagate exception as error if not done
- if ( status === 1 ) {
- done( 0, "error", "" + e );
- jXHR = false;
+ if ( status < 2 ) {
+ done( -1, "" + e );
// Simply rethrow otherwise
} else {
jQuery.error( e );