\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
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
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
\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
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
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
- state : 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
\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
* <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',
obj.onAuthError = X_NET_OAUTH2_onXHR401Error;
obj.updateRequest = X_NET_OAUTH2_updateRequest;
+ // TODO canUse
// TODO kill の cancel
},
};
// 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 );
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 );
};
};
-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 );
};