if( this._isMsXML ){\r
raw[ 'onreadystatechange' ] = X_NET_XHRWrapper.handleEvent;\r
} else\r
+ if( X_Net_XHR_progress || this._isXDR ){\r
+ this[ 'listen' ]( [ 'load', 'progress', 'error', 'timeout' ] ); //, 'abort'\r
+ } else\r
if( X_UA[ 'IE8' ] ){\r
this[ 'listen' ]( [ 'readystatechange', 'error', 'timeout' ] );\r
} else\r
if( X_UA[ 'IE7' ] ){\r
this[ 'listen' ]( [ 'readystatechange', 'error' ] );\r
- } else\r
- if( X_Net_XHR_progress ){\r
- this[ 'listen' ]( [ 'load', 'progress', 'error', 'timeout' ] ); //, 'abort'\r
+ \r
} else {\r
this[ 'listen' ]( [ 'load', 'readystatechange', 'error', 'timeout' ] ); //, 'abort'\r
};\r
handleEvent : function( e ){\r
var raw = X_NET_XHRWrapper[ '_rawObject' ],\r
live = !X_NET_XHRWrapper._canceled,\r
- status, data;\r
+ headers, status, data;\r
\r
switch( e && e.type || 'readystatechange' ){\r
/*\r
\r
if( !X_NET_XHRWrapper._busy ) return;\r
\r
- \r
X_NET_XHRWrapper._percent = 100;\r
X_NET_XHRWrapper._busy = false;\r
status = raw.status;\r
\r
+ // TODO GET_FULL_HEADERS\r
+ // Implemented in: MSXML 3.0 and MSXML 6.0\r
+ if( !X_NET_XHRWrapper._isXDR && ( ( !X_NET_XHRWrapper._isMsXML && raw.getAllResponseHeaders ) || 3 <= X_Net_XHR_msXMLVer ) && ( headers = raw.getAllResponseHeaders() ) ){\r
+ headers = X_NET_XHR_parseResponseHeaders( headers );\r
+ };\r
+ \r
// https://code.google.com/p/fakeworker-js/source/browse/src/javascript/fakeworker.js\r
if(\r
( !status && location.protocol === 'file:' ) ||\r
// IE 6.0 でローカルファイルにアクセスした\r
- ( status < 100 ) ||\r
+ ( status < 100 && ( status = 200 ) ) ||\r
( 200 <= status && status < 400 ) ||\r
//status === 304 ||\r
( status === 1223 && ( status = 204 ) ) ||\r
break;\r
};\r
\r
- X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, data : data } );\r
+ X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, data : data, headers : headers || null } );\r
} else {\r
- X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100 } );\r
+ X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100, headers : headers || null } );\r
};\r
break;\r
\r
\r
};\r
\r
+/**\r
+ * https://gist.github.com/mmazer/5404301\r
+ * \r
+ * XmlHttpRequest's getAllResponseHeaders() method returns a string of response\r
+ * headers according to the format described here:\r
+ * http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method\r
+ * This method parses that string into a user-friendly key/value pair object.\r
+ * \r
+ * http://hakuhin.jp/js/xmlhttprequest.html#XHR_GET_ALL_RESPONSE_HEADERS\r
+ * 複数の情報が存在する場合、改行で区切られています。\r
+ */\r
+\r
+function X_NET_XHR_parseResponseHeaders( headerStr ){\r
+ var headers = {}, headerPairs, i = 0, l, headerPair, index, key, value;\r
+ \r
+ if( !headerStr ) return headers;\r
+\r
+ headerPairs = headerStr.split( '\u000d\u000a' );\r
+ for( l = headerPairs.length; i < l ; ++i ){\r
+ headerPair = headerPairs[i];\r
+ index = headerPair.indexOf( '\u003a\u0020' );\r
+ if( index > 0 ){\r
+ key = headerPair.substring( 0, index );\r
+ val = headerPair.substring( index + 2 );\r
+ headers[ key ] = val.split( '\r\n' ).join( '\n' ).split( '\n' );\r
+ };\r
+ };\r
+ return headers;\r
+};\r
+\r