OSDN Git Service

Version 0.6.152, fix X.OAuth2.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 20 May 2015 13:35:09 +0000 (22:35 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 20 May 2015 13:35:09 +0000 (22:35 +0900)
0.6.x/js/01_core/01_X.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/06_net/05_XXHRGadget.js
0.6.x/js/06_net/10_XOAuth2.js

index 92cc634..2b20721 100644 (file)
@@ -61,14 +61,17 @@ function X( v ){
 \r
 //{+DEV\r
 if( !window['console'] || ( window.parent && window.parent.log ) )\r
-       console = { log : function(a){\r
-               var win, elm;\r
-               //alert(a);\r
-               if( window.parent ){\r
-                       elm = parent.document.all ? parent.document.all.log : parent.log || parent.document.getElementById( 'log' );\r
-                       elm && ( elm.innerHTML = a + '<br>' + elm.innerHTML );\r
-               };\r
-       } };\r
+       console = {\r
+               log : function(a){\r
+                               var win, elm;\r
+                               //alert(a);\r
+                               if( window.parent ){\r
+                                       elm = parent.document.all ? parent.document.all.log : parent.log || parent.document.getElementById( 'log' );\r
+                                       elm && ( elm.innerHTML = a + '<br>' + elm.innerHTML );\r
+                               };\r
+                       },\r
+               dir : function(){}\r
+       };\r
 //+DEV}\r
 \r
 //{-AUDIO\r
index ec0ee1a..e400763 100644 (file)
@@ -234,7 +234,7 @@ function X_NET_proxyDispatch( e ){
                case X_EVENT_ERROR :\r
                        if( e.status === 401 ){\r
                                if( auth = X_Pair_get( this )[ 'auth' ] ){\r
-                                       X_Pair_get( auth ).onAuthError( auth );\r
+                                       X_Pair_get( auth ).onAuthError( auth, e );\r
                                };\r
                        };\r
                        \r
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
index 3d2cf68..28dc843 100644 (file)
@@ -46,7 +46,7 @@ var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],
 \r
 function X_NET_GIMR_detectImageOverIframe(){\r
        var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],\r
-               iwin, ret, n, error, data = null;\r
+               iwin, ret, n, error, data = null, zero, e;\r
        \r
        if( raw ){\r
                iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];\r
@@ -91,7 +91,7 @@ function X_NET_GIMR_detectImageOverIframe(){
                                                        X_NET_GIMR_receivedString = ret;\r
                                                };\r
 \r
-                                               var zero = String.fromCharCode( 0 );\r
+                                               zero = String.fromCharCode( 0 );\r
                                                console.log( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '--' ).split( zero + 'E0F' ).join( '--' ) );\r
                                                ret = X_String_parseTrustedJsonString( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '。' ).split( zero + 'F0E' ).join( '.' ) );\r
                                                \r
@@ -105,18 +105,20 @@ function X_NET_GIMR_detectImageOverIframe(){
                                                                break;\r
                                                };\r
                                                \r
-                                               console.dir( data || ret );\r
+                                               //console.dir( data || ret );\r
                                                \r
                                                X_NET_GIMRWrapper._busy = false;\r
                                                \r
                                                X_NET_GIMRWrapper\r
-                                                       [ 'asyncDispatch' ]({\r
-                                                               type      : error ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
-                                                               stat    : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 400 : 200 ),\r
+                                                       [ 'asyncDispatch' ]( e = {\r
+                                                               type      : error || ret[ 'rc' ] < 200 || 400 < ret[ 'rc' ] ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
+                                                               status    : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 400 : 200 ),\r
                                                                data      : data,\r
                                                                'headers' : ret[ 'headers' ],\r
                                                                'message' : error && ret[ 'errors' ].join( '\n' )\r
                                                        });\r
+                                               \r
+                                               //console.dir( e );\r
                                                        \r
                                                X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;\r
                                                X_NET_GIMR_lastHashString = '';                                                 \r
@@ -179,7 +181,7 @@ X_NET_GIMRWrapper = X_Class_override(
                        \r
                        X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj );\r
        \r
-                       console.dir( obj );\r
+                       //console.dir( obj );\r
                        \r
                        X_NET_GIMR_requestOptions = {\r
                                'CONTENT_TYPE'     : 'TEXT',\r
index d8f3dd1..43a34d6 100644 (file)
@@ -21,6 +21,9 @@ var X_NET_OAUTH2_detection      = new Function( 'w', 'try{return w.location.sear
  * <dt>3 : <dd>refresh_token
  * <dt>4 : <dd>hasAccessToken
  * </dl>
+ * 
+ * original :
+ *  oauth2.js , <opendata@oucs.ox.ac.uk>
  */
 X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                'X.OAuth2',
@@ -43,6 +46,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                obj.onAuthError   = X_NET_OAUTH2_onXHR401Error;
                                obj.updateRequest = X_NET_OAUTH2_updateRequest;
                                
+                               // TODO canUse
                                // TODO kill の cancel
                        },
 
@@ -90,7 +94,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                };
                                
                                // http://kojikoji75.hatenablog.com/entry/2013/12/15/223839
-                               X_NET_OAUTH2_authorizationWindow && X_NET_OAUTH2_authorizationWindow.open( 'about:blank','_self' ).close();
+                               X_NET_OAUTH2_authorizationWindow && X_NET_OAUTH2_authorizationWindow.open( 'about:blank', '_self' ).close();
                                X_NET_OAUTH2_authorizationWindow  = null;
                                
                                X_NET_OAUTH2_authorizationTimerID && X_Timer_remove( X_NET_OAUTH2_authorizationTimerID );
@@ -146,7 +150,7 @@ function X_Net_OAuth2_detectAuthPopup(){
                pair      = X_Pair_get( this );
                pair.code = X_URL_ParamToObj( search.slice( 1 ) )[ 'code' ];
 
-               X_NET_OAUTH2_authorizationWindow.close();
+               X_NET_OAUTH2_authorizationWindow.open( 'about:blank', '_self' ).close();
                closed = true;
 
                X_Net_OAuth2_authorizationCode( this, pair );
@@ -241,27 +245,30 @@ function X_Net_OAuth2_responceHandler( e ){
        };
 };
 
-function X_NET_OAUTH2_onXHR401Error( oauth2 ){
+function X_NET_OAUTH2_onXHR401Error( oauth2, e ){
        var pair = this,
+               headers = e[ 'headers' ],
                xhr, bearerParams, headersExposed = false;
        
        if( _getAuthMechanism( oauth2 ) !== 'param' ){
                xhr            = X_NET_currentWrapper[ '_rawObject' ];
-               bearerParams   = xhr.getResponseHeader( 'WWW-Authenticate' );
-               headersExposed = !X_Net_XHR_createXDR || !!xhr.getAllResponseHeaders(); // this is a hack for Firefox and IE
+               headersExposed = !X_Net_XHR_createXDR || !!headers; // this is a hack for Firefox and IE
+               bearerParams   = headersExposed && ( headers[ 'WWW-Authenticate' ] || headers[ 'www-authenticate' ] );
+               X_Type_isArray( bearerParams ) && ( bearerParams = bearerParams.join( '\n' ) );
        };
        
        // http://d.hatena.ne.jp/ritou/20110402/1301679908
-       if ( bearerParams && bearerParams.indexOf( ' error="' ) === -1 ) {
+       if ( bearerParams && bearerParams.indexOf( ' error=' ) === -1 ) {
                pair.oauth2State = 0;
                oauth2[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
        } else
-       if ((( bearerParams && bearerParams.indexOf( ' error="invalid_token"' ) !== -1 ) || !headersExposed) && _getRefreshToken( oauth2 ) ) {
+       if ((( bearerParams && bearerParams.indexOf( 'invalid_token' ) !== -1 ) || !headersExposed) && _getRefreshToken( oauth2 ) ) {
                _removeAccessToken( oauth2 ); // It doesn't work any more.
                pair.oauth2State = 3;
                oauth2[ 'refreshToken' ]();
-       } else
-       if (!headersExposed && !_getRefreshToken( oauth2 )) {
+       } else {
+       //if (!headersExposed && !_getRefreshToken( oauth2 )) {
+               _removeAccessToken( oauth2 ); // It doesn't work any more.
                pair.oauth2State = 0;
                oauth2[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
        };