| 7798 | |
| 7799 | // Chain conversions given the request and the original response |
| 7800 | function ajaxConvert( s, response ) { |
| 7801 | |
| 7802 | // Apply the dataFilter if provided |
| 7803 | if ( s.dataFilter ) { |
| 7804 | response = s.dataFilter( response, s.dataType ); |
| 7805 | } |
| 7806 | |
| 7807 | var dataTypes = s.dataTypes, |
| 7808 | converters = {}, |
| 7809 | i, |
| 7810 | key, |
| 7811 | length = dataTypes.length, |
| 7812 | tmp, |
| 7813 | // Current and previous dataTypes |
| 7814 | current = dataTypes[ 0 ], |
| 7815 | prev, |
| 7816 | // Conversion expression |
| 7817 | conversion, |
| 7818 | // Conversion function |
| 7819 | conv, |
| 7820 | // Conversion functions (transitive conversion) |
| 7821 | conv1, |
| 7822 | conv2; |
| 7823 | |
| 7824 | // For each dataType in the chain |
| 7825 | for ( i = 1; i < length; i++ ) { |
| 7826 | |
| 7827 | // Create converters map |
| 7828 | // with lowercased keys |
| 7829 | if ( i === 1 ) { |
| 7830 | for ( key in s.converters ) { |
| 7831 | if ( typeof key === "string" ) { |
| 7832 | converters[ key.toLowerCase() ] = s.converters[ key ]; |
| 7833 | } |
| 7834 | } |
| 7835 | } |
| 7836 | |
| 7837 | // Get the dataTypes |
| 7838 | prev = current; |
| 7839 | current = dataTypes[ i ]; |
| 7840 | |
| 7841 | // If current is auto dataType, update it to prev |
| 7842 | if ( current === "*" ) { |
| 7843 | current = prev; |
| 7844 | // If no auto and dataTypes are actually different |
| 7845 | } else if ( prev !== "*" && prev !== current ) { |
| 7846 | |
| 7847 | // Get the converter |
| 7848 | conversion = prev + " " + current; |
| 7849 | conv = converters[ conversion ] || converters[ "* " + current ]; |
| 7850 | |
| 7851 | // If there is no direct converter, search transitively |
| 7852 | if ( !conv ) { |
| 7853 | conv2 = undefined; |
| 7854 | for ( conv1 in converters ) { |
| 7855 | tmp = conv1.split( " " ); |
| 7856 | if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { |
| 7857 | conv2 = converters[ tmp[1] + " " + current ]; |