json: /json/
},
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText"
+ },
+
// Prefilters
// 1) They are useful to introduce custom dataTypes (see transport/jsonp for an example)
// 2) These are called:
// Parse text as xml
"text xml": jQuery.parseXML
- },
-
- // Utility function that handles dataType when response is received
- // (for those transports that can give text or xml responses)
- determineResponse: function( responses , ct ) {
-
- var s = this,
- contents = s.contents,
- type,
- regexp,
- dataTypes = s.dataTypes,
- transportDataType = dataTypes[0],
- response;
-
- // Auto (xml, json, script or text determined given headers)
- if ( ct && transportDataType === "*" ) {
-
- for ( type in contents ) {
- if ( ( regexp = contents[ type ] ) && regexp.test( ct ) ) {
- transportDataType = dataTypes[0] = type;
- break;
- }
- }
- }
-
- // Get response
- for( type in responses ) {
- if ( type === transportDataType ) {
- break;
- }
- }
-
- // Get final response
- response = responses[ type ];
-
- // If it's not the right dataType, handle the dataTypeList
- if ( transportDataType !== type ) {
- if ( transportDataType === "*" ) {
- dataTypes.shift();
- }
- dataTypes.unshift( type );
- }
-
- return response;
}
-
},
ajaxPrefilter: function( a , b ) {
// Callback for when everything is done
// It is defined here because jslint complains if it is declared
// at the end of the function (which would be more logical and readable)
- function done( status , statusText , response , headers) {
+ function done( status , statusText , responses , headers) {
// Called once
if ( state === 2 ) {
state = 2;
// Dereference transport for early garbage collection
- // (no matter how long the jXHR transport will be used
+ // (no matter how long the jXHR object will be used)
transport = undefined;
// Set readyState
clearTimeout(timeoutTimer);
}
- var // Reference url
- url = s.url,
- // and ifModified status
- ifModified = s.ifModified,
+ var // Reference dataTypes and responseFields
+ dataTypes = s.dataTypes,
+ responseFields = s.responseFields,
+ responseField,
- // Is it a success?
- isSuccess = 0,
+ // Flag to mark as success
+ isSuccess,
// Stored success
success,
// Stored error
error,
// To keep track of statusCode based callbacks
- oldStatusCode;
+ oldStatusCode,
+
+ // Actual response
+ response;
+
+ // If we got responses:
+ // - find the right one
+ // - update dataTypes accordingly
+ // - set responseXXX accordingly too
+ if ( responses ) {
+
+ var contents = s.contents,
+ transportDataType = dataTypes[0],
+ ct,
+ type,
+ finalDataType;
+
+ // Auto (xml, json, script or text determined given headers)
+ if ( transportDataType === "*" && ( ct = jXHR.getResponseHeader( "content-type" ) ) ) {
+
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ transportDataType = dataTypes[0] = type;
+ break;
+ }
+ }
+
+ type = undefined;
+ }
+
+ // Get final dataType
+ for( type in responses ) {
+ if ( ! finalDataType && type === transportDataType ) {
+ finalDataType = type;
+ }
+ responseField = responseFields[ type ];
+ if ( responseField && ! ( responseField in jXHR ) ) {
+ jXHR[ responseField ] = responses[ type ];
+ }
+ }
+
+ // If no response with the expected dataType was provided
+ // Take the last response as a default if it exists
+ if ( ! finalDataType && type ) {
+ finalDataType = type;
+ if ( transportDataType === "*" ) {
+ dataTypes.shift();
+ }
+ dataTypes.unshift( finalDataType );
+ }
+
+ // Get final response
+ response = responses[ finalDataType ];
+ }
// If successful, handle type chaining
if ( status >= 200 && status < 300 || status === 304 ) {
// If not modified
if ( status === 304 ) {
- // Set the statusText accordingly
statusText = "notmodified";
- // Mark as a success
isSuccess = 1;
// If we have data
} else {
- // Set the statusText accordingly
statusText = "success";
// Chain data conversions and determine the final value
// Conversion functions (when text is used in-between)
conv1,
conv2,
- // Local references to dataTypes & converters
- dataTypes = s.dataTypes,
- converters = s.converters,
- // DataType to responseXXX field mapping
- responses = {
- "xml": "XML",
- "text": "Text"
- };
+ // Local references to converters
+ converters = s.converters;
// For each dataType in the chain
for( i = 0 ; i < dataTypes.length ; i++ ) {
// If a responseXXX field for this dataType exists
// and if it hasn't been set yet
- if ( responses[ current ] ) {
- // Set it
- jXHR[ "response" + responses[ current ] ] = response;
- // Mark it as set
- responses[ current ] = 0;
+ responseField = responseFields[ current ];
+ if ( responseField && ! ( responseField in jXHR ) ) {
+ jXHR[ responseField ] = response;
}
// If this is not the first element
// if not success, mark it as an error
} else {
-
error = statusText = statusText || "error";
-
- // Set responseText if needed
- if ( response ) {
- jXHR.responseText = response;
- }
}
// Set data for the fake xhr object