OSDN Git Service

Version 0.6.152, fix X.OAuth2.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 01_XNetXHR.js
index 8d16cfa..2a12df8 100644 (file)
@@ -287,14 +287,15 @@ X_TEMP.X_Net_XHR_init = function(){
                                        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
@@ -359,7 +360,7 @@ X_TEMP.X_Net_XHR_init = function(){
                        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
@@ -403,16 +404,21 @@ X_TEMP.X_Net_XHR_init = function(){
 \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
@@ -450,9 +456,9 @@ X_TEMP.X_Net_XHR_init = function(){
                                                                        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
@@ -505,3 +511,33 @@ X_TEMP.X_Net_XHR_init = function(){
 \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