*/\r
\r
/*\r
- * Window\r
+ * original:\r
* by https://web.archive.org/web/20100413085309/http://nurucom-archives.hp.infoseek.co.jp/digital/trans-uri.html\r
*/\r
+var _builtin_skipEncodeURI = (function(){\r
+ var encodeURIComponentTarget = '!\'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~',\r
+ encodeURITarget = '#$&+,-/:;=?@',\r
+ obj = {}, i;\r
+ for( i = encodeURIComponentTarget.length; i; ){\r
+ obj[ encodeURIComponentTarget.charCodeAt( --i ) ] = 2;\r
+ };\r
+ for( i = encodeURITarget.length; i; ){\r
+ obj[ encodeURITarget.charCodeAt( --i ) ] = 1;\r
+ };\r
+ return obj;\r
+})();\r
\r
-/*\r
- * //\r
-// TransURI (UTF-8): transURI.js (Ver.041211)\r
-//\r
-// Copyright (C) http://nurucom-archives.hp.infoseek.co.jp/digital/\r
-//\r
+// /[^!#$&-;=?-Z_a-z~]/g\r
+window.encodeURI || (window.encodeURI = function( x ){ return _builtin_encodeURI( x, 0 ); });\r
+// /[^!'-*.0-9A-Z_a-z~-]/g\r
+window.encodeURIComponent || (window.encodeURIComponent = function( x ){ return _builtin_encodeURI( x, 1 ); });\r
\r
-EncodeURI=function(str){\r
- return str.replace(/[^!#$&-;=?-Z_a-z~]/g,function(s){\r
- var c=s.charCodeAt(0);\r
- return (c<16?"%0"+c.toString(16):c<128?"%"+c.toString(16):c<2048?"%"+(c>>6|192).toString(16)+"%"+(c&63|128).toString(16):"%"+(c>>12|224).toString(16)+"%"+(c>>6&63|128).toString(16)+"%"+(c&63|128).toString(16)).toUpperCase()\r
- })\r
+function _builtin_encodeURI( x, kind ){\r
+ var result = [],\r
+ skip = _builtin_skipEncodeURI,\r
+ p = '%',\r
+ i = 0, l, chr, c;\r
+ \r
+ x += '';\r
+ \r
+ for( l = x.length; i < l; ++i ){\r
+ if( !( kind < skip[ c = x.charCodeAt( i ) ] ) ){\r
+ chr = (\r
+ c < 16 ? '%0' + c.toString(16) :\r
+ c < 128 ? p + c.toString(16) :\r
+ c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :\r
+ p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)\r
+ ).toUpperCase();\r
+ } else {\r
+ chr = x.charAt( i );\r
+ };\r
+ result[ i ] = chr;\r
+ };\r
+ \r
+ return result.join( '' );\r
};\r
\r
-EncodeURIComponent=function(str){\r
- return str.replace(/[^!'-*.0-9A-Z_a-z~-]/g,function(s){\r
- var c=s.charCodeAt(0);\r
- return (c<16?'%0'+c.toString(16):c<128?'%'+c.toString(16):c<2048?'%'+(c>>6|192).toString(16)+'%'+(c&63|128).toString(16):'%'+(c>>12|224).toString(16)+'%'+(c>>6&63|128).toString(16)+'%'+(c&63|128).toString(16)).toUpperCase()\r
- })\r
-};\r
\r
-DecodeURI=function(str){\r
- return str.replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig,function(s){\r
- var c=parseInt(s.substring(1),16);\r
- return String.fromCharCode(c<128?c:c<224?(c&31)<<6|parseInt(s.substring(4),16)&63:((c&15)<<6|parseInt(s.substring(4),16)&63)<<6|parseInt(s.substring(7),16)&63)\r
- })\r
+function _builtin_decodeURI( x ){\r
+ var result = [],\r
+ toInt = parseInt,\r
+ toChrCode = String.fromCharCode,\r
+ n = -1, i = 0, l, chr, decode, code, memory;\r
+ \r
+ x += '';\r
+ \r
+ for( l = x.length; i < l; ++i ){\r
+ if( decode ){\r
+ code = toInt( x.substr( i, 2 ), 16 );\r
+ ++i; \r
+ if( 127 < code ){\r
+ if( 223 < code ){\r
+ memory = ( code & 15 ) << 12;\r
+ code = toInt( x.substr( i + 2, 2 ), 16 ) & 63; // 00%00%00\r
+ i += 3;\r
+ memory += code << 6; \r
+ } else {\r
+ memory = ( code & 63 ) << 6;\r
+ };\r
+ code = toInt( x.substr( i + 2, 2 ), 16 ) & 63;\r
+ i += 3;\r
+ code += memory;\r
+ };\r
+ // if( code !== code ) error\r
+ //console.log( code );\r
+ result[ ++n ] = toChrCode( code );\r
+ decode = false;\r
+ } else {\r
+ chr = x.charAt( i );\r
+ if( !( decode = chr === '%' ) ){\r
+ result[ ++n ] = chr; \r
+ };\r
+ };\r
+ };\r
+ return result.join( '' );\r
};\r
- */\r
-\r
-/* 正規表現が使われているため、まだ投入しない itozyun*/\r
-window.encodeURI || (window.encodeURI = function (x) {\r
- return ("" + x).replace(/[^!#$&-;=?-Z_a-z~]/g, function (s) {\r
- var c = s.charCodeAt(0), p = "%";\r
- return (\r
- c < 16 ? "%0" + c.toString(16) :\r
- c < 128 ? p + c.toString(16) :\r
- c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :\r
- p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)\r
- ).toUpperCase();\r
- });\r
-});\r
-\r
-window.encodeURIComponent || (window.encodeURIComponent = function (x) {\r
- return ("" + x).replace(/[^!'-*.0-9A-Z_a-z~-]/g, function (s) {\r
- var c = s.charCodeAt(0), p = "%";\r
- return (\r
- c < 16 ? "%0" + c.toString(16) :\r
- c < 128 ? p + c.toString(16) :\r
- c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :\r
- p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)\r
- ).toUpperCase();\r
- });\r
-});\r
-\r
-// 手抜き\r
-window.decodeURI || (window.decodeURI = function (x) {\r
- return ("" + x).replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig, function (s) {\r
- var c = parseInt(s.substring(1), 16);\r
- return String.fromCharCode(\r
- c < 128 ? c :\r
- c < 224 ? (c & 31) << 6 | parseInt(s.substring(4), 16) & 63 :\r
- ((c & 15) << 6 | parseInt(s.substring(4), 16) & 63) << 6 | parseInt(s.substring(7), 16) & 63\r
- );\r
- });\r
-});\r
-\r
-\r
\r
-//window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI);\r
+window.decodeURI || (window.decodeURI = _builtin_decodeURI);\r
+window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI);\r
\r
\r
/*\r
};\r
for( k in src ){\r
//if( X_EMPTY_OBJECT[ k ] ) continue;\r
- ret[ k ] = clone( src[ k ], objSrc, objCopy, n );\r
+ ret[ k ] = X_Object_deepCopy_( src[ k ], objSrc, objCopy, n );\r
};\r
return ret;\r
};\r
\r
'toChrReferance' : X_String_toChrReferance,\r
\r
- 'isNumberString' : X_String_isNumberString\r
+ 'isNumberString' : X_String_isNumberString,\r
+ \r
+ 'serialize' : X_String_serialize\r
};\r
\r
// ------------------------------------------------------------------------- //\r
return '' + n === v || '' + n === '0' + v;\r
};\r
\r
+// https://github.com/jquery/jquery/blob/master/src/serialize.js\r
+function X_String_serialize( a, traditional ) {\r
+ var prefix,\r
+ list = [];\r
+\r
+ // If an array was passed in, assume that it is an array of form elements.\r
+ if ( X_Type_isArray( a ) && false ) {\r
+ // Serialize the form elements\r
+ //jQuery.each( a, function() {\r
+ // X_String_serialize_addParam( list, this.name, this.value );\r
+ //});\r
+\r
+ } else {\r
+ // If traditional, encode the 'old' way (the way 1.3.2 or older\r
+ // did it), otherwise encode params recursively.\r
+ for ( prefix in a ) {\r
+ X_String_serialize_buildParams( list, prefix, a[ prefix ], traditional );\r
+ }\r
+ }\r
+\r
+ // Return the resulting serialization\r
+ return list.join( '&' ).split( '%20' ).join( '+' );\r
+};\r
+\r
+function X_String_serialize_addParam( list, key, value ){\r
+ // If value is a function, invoke it and return its value\r
+ value = X_Type_isFunction( value ) ? value() : ( value == null ? '' : value );\r
+ list[ list.length ] = encodeURIComponent( key ) + '=' + encodeURIComponent( value );\r
+};\r
+\r
+function X_String_serialize_buildParams( list, prefix, obj, traditional ) {\r
+ var name;\r
+\r
+ if ( X_Type_isArray( obj ) ) {\r
+ // Serialize array item.\r
+ for( i = 0, l = obj.length; i < l; ++i ){\r
+ v = obj[ i ];\r
+ if ( traditional || prefix === '[]' ) {\r
+ // Treat each array item as a scalar.\r
+ X_String_serialize_addParam( list, prefix, v );\r
+\r
+ } else {\r
+ // Item is non-scalar (array or object), encode its numeric index.\r
+ X_String_serialize_buildParams(\r
+ list,\r
+ prefix + '[' + ( X_Type_isObject( v ) ? i : '' ) + ']',\r
+ v,\r
+ traditional\r
+ );\r
+ }; \r
+ };\r
+\r
+ } else\r
+ if ( !traditional && X_Type_isObject( obj ) ) {\r
+ // Serialize object item.\r
+ for ( name in obj ) {\r
+ X_String_serialize_buildParams( list, prefix + '[' + name + ']', obj[ name ], traditional );\r
+ };\r
+\r
+ } else {\r
+ // Serialize scalar item.\r
+ X_String_serialize_addParam( list, prefix, obj );\r
+ };\r
+};\r
alert( 'X.Net args error' );\r
return; \r
};\r
-\r
+ url = opt[ 'url' ];\r
};\r
\r
if( !X_Type_isString( url ) ){\r
\r
}; \r
\r
- opt = X_Object_clone( opt );\r
+ opt = X_Object_deepCopy( opt );\r
opt.netType = type;\r
opt[ 'url' ] = url;\r
\r
X_NET_completePhase;\r
\r
function X_NET_proxyDispatch( e ){\r
- var i, flag;\r
+ var i, flag, auth;\r
\r
switch( e.type ){\r
case X_EVENT_BEFORE_KILL_INSTANCE :\r
case X_EVENT_PROGRESS :\r
this[ 'dispatch' ]( e );\r
break;\r
- case X_EVENT_SUCCESS :\r
+ \r
case X_EVENT_ERROR :\r
+ if( e.status === 401 ){\r
+ auth = X_Pair_get( this )[ 'auth' ];\r
+ if( auth ){\r
+ X_Pair_get( auth ).onAuthError( auth );\r
+ };\r
+ };\r
+ \r
+ case X_EVENT_SUCCESS :\r
case X_EVENT_TIMEOUT :\r
X_NET_completePhase = true;\r
this\r
};\r
\r
function X_NET_shiftQueue(){\r
+ var auth, authSettings;\r
\r
if( X_NET_currentQueue ){\r
if( X_NET_currentWrapper._busy ) return;\r
switch( X_NET_currentData.netType ){\r
case X_NET_TYPE_XHR :\r
X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init();\r
+ // TODO OAuth2\r
+ // oauth2.authState() -> NEED_AUTH -> COMPLETE, refresh 中なら後回し。\r
+ \r
+ if( auth = X_NET_currentData[ 'auth' ] ){\r
+ authSettings = X_Pair_get( auth );\r
+ switch( auth.state() ){\r
+ case 0 :\r
+ case 1 :\r
+ if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_Callback_PREVENT_DEFAULT ) ){\r
+ authSettings.lazyReq = X_NET_currentQueue;\r
+ };\r
+ X_NET_currentQueue = null;\r
+ X_NET_shiftQueue();\r
+ break;\r
+ case 2 : // refresh token\r
+ X_NET_QUEUE_LIST.push( X_NET_currentQueue );\r
+ X_NET_currentQueue = null;\r
+ X_NET_shiftQueue();\r
+ return;\r
+ };\r
+ authSettings.updateRequest( auth, X_NET_currentData );\r
+ };\r
break;\r
case X_NET_TYPE_JSONP :\r
X_NET_currentWrapper = X_NET_JSONPWrapper || X_TEMP.X_NET_JSONP_init();\r
_percent : 0,\r
_timerID : 0,\r
\r
+ _auth : null,\r
+ \r
load : function( obj ){\r
var raw = this[ '_rawObject' ],\r
method = obj[ 'method' ],\r
username = obj[ 'username' ],\r
password = obj[ 'password' ],\r
headers = obj[ 'headers' ] || {},\r
- postdata = obj[ 'postdata' ],\r
+ postdata = obj[ 'postdata' ] || '',\r
timeout = obj[ 'timeout' ] || 20000,\r
tmp;\r
- \r
+\r
this._dataType = obj[ 'dataType' ] || X_URL_getEXT( url );\r
\r
if( X_Net_XHR_X_DOMAIN ){\r
if( X_URL_isSameDomain( url ) ){ // isXDomain\r
if( this._isXDR ){\r
X_EventDispatcher_toggleAllEvents( this, false );\r
- this[ '_rawObject' ] = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
+ this[ '_rawObject' ] = raw = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
X_EventDispatcher_toggleAllEvents( this, true );\r
- this._isXDR = false; \r
+ this._isXDR = false;\r
};\r
} else {\r
if( !this._isXDR ){\r
X_EventDispatcher_toggleAllEvents( this, false );\r
- this[ '_rawObject' ] = X_Net_XHR_X_DOMAIN;\r
+ this[ '_rawObject' ] = raw = X_Net_XHR_X_DOMAIN;\r
X_EventDispatcher_toggleAllEvents( this, true );\r
- this._isXDR = true; \r
+ this._isXDR = true; \r
};\r
};\r
};\r
console.log( obj[ 'mimeType' ] || tmp );\r
};\r
\r
- if( !X_Net_XHR_ACTIVE_X && X_Type_isFunction( raw.setRequestHeader ) ){\r
+ if( /* !X_Net_XHR_ACTIVE_X && !this._isXDR && */ X_Type_isFunction( raw.setRequestHeader ) ){\r
\r
// http://nakigao.sitemix.jp/blog/?p=2040\r
// json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
\r
// send 前にフラグを立てる,回線が早いと raw.send() 内で onload -> _busy = false ののち、 _busy = true するため。\r
this._busy = true;\r
- \r
- // TODO toString\r
- raw.send( postdata || '' );\r
+\r
+ raw.send( X_Type_isString( postdata ) ? postdata : X_String_serialize( postdata ) );\r
},\r
\r
cancel : function(){\r
};\r
\r
this[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, data : data } );\r
- } else {\r
- live && this[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100 } );\r
+ } else\r
+ if( live ){\r
+ this[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100 } );\r
};\r
break;\r
\r