66 *
77 * GitHub: http://github.com/qiniu/js-sdk
88 *
9- * Date: 2015-12-28
9+ * Date: 2016-1-26
1010*/
1111
1212/*global plupload ,mOxie*/
@@ -48,7 +48,8 @@ function readCookie(key) {
4848 return null ;
4949}
5050
51-
51+ // if current browser is not support localStorage
52+ // use cookie to make a polyfill
5253if ( ! window . localStorage ) {
5354 window . localStorage = {
5455 setItem : function ( key , value ) {
@@ -67,13 +68,6 @@ function QiniuJsSDK() {
6768
6869 var that = this ;
6970
70- var qiniuUploadUrl ;
71- if ( window . location . protocol === 'https:' ) {
72- qiniuUploadUrl = 'https://up.qbox.me' ;
73- } else {
74- qiniuUploadUrl = 'http://upload.qiniu.com' ;
75- }
76-
7771 /**
7872 * detect IE version
7973 * if current browser is not IE
@@ -142,6 +136,46 @@ function QiniuJsSDK() {
142136 }
143137
144138
139+ var qiniuUploadUrl ;
140+ if ( window . location . protocol === 'https:' ) {
141+ qiniuUploadUrl = 'https://up.qbox.me' ;
142+ } else {
143+ qiniuUploadUrl = 'http://upload.qiniu.com' ;
144+ }
145+
146+ /**
147+ * qiniu upload urls
148+ * 'qiniuUploadUrls' is used to change target when current url is not avaliable
149+ * @type {Array }
150+ */
151+ var qiniuUploadUrls = [
152+ "http://upload.qiniu.com" ,
153+ "http://up.qiniu.com" ,
154+ ] ;
155+
156+ var changeUrlTimes = 0 ;
157+
158+ /**
159+ * reset upload url
160+ * if current page protocal is https
161+ * it will always return 'https://up.qbox.me'
162+ * else
163+ * it will set 'qiniuUploadUrl' value with 'qiniuUploadUrls' looply
164+ */
165+ this . resetUploadUrl = function ( ) {
166+ if ( window . location . protocol === 'https:' ) {
167+ qiniuUploadUrl = 'https://up.qbox.me' ;
168+ } else {
169+ var i = changeUrlTimes % qiniuUploadUrls . length ;
170+ qiniuUploadUrl = qiniuUploadUrls [ i ] ;
171+ changeUrlTimes ++ ;
172+ }
173+ logger . debug ( 'resetUploadUrl: ' + qiniuUploadUrl ) ;
174+ } ;
175+
176+ this . resetUploadUrl ( ) ;
177+
178+
145179 /**
146180 * is image
147181 * @param {String } url of a file
@@ -825,6 +859,24 @@ function QiniuJsSDK() {
825859
826860 logger . debug ( "bind ChunkUploaded event" ) ;
827861
862+ var retries = qiniuUploadUrls . length ;
863+
864+ // if error is unkown switch upload url and retry
865+ var unknow_error_retry = function ( file ) {
866+ if ( retries -- > 0 ) {
867+ setTimeout ( function ( ) {
868+ that . resetUploadUrl ( ) ;
869+ file . status = plupload . QUEUED ;
870+ uploader . stop ( ) ;
871+ uploader . start ( ) ;
872+ } , 0 ) ;
873+ return true ;
874+ } else {
875+ retries = qiniuUploadUrls . length ;
876+ return false ;
877+ }
878+ } ;
879+
828880 // bind 'Error' event
829881 // check the err.code and return the errTip
830882 uploader . bind ( 'Error' , ( function ( _Error_Handler ) {
@@ -850,6 +902,9 @@ function QiniuJsSDK() {
850902 if ( err . response === '' ) {
851903 // Fix parseJSON error ,when http error is like net::ERR_ADDRESS_UNREACHABLE
852904 errTip = err . message || '未知网络错误。' ;
905+ if ( ! unknow_error_retry ( file ) ) {
906+ return ;
907+ }
853908 break ;
854909 }
855910 var errorObj = that . parseJSON ( err . response ) ;
@@ -869,6 +924,9 @@ function QiniuJsSDK() {
869924 break ;
870925 case 599 :
871926 errTip = "网络连接异常。请重试或提交反馈。" ;
927+ if ( ! unknow_error_retry ( file ) ) {
928+ return ;
929+ }
872930 break ;
873931 case 614 :
874932 errTip = "文件已存在。" ;
@@ -887,6 +945,9 @@ function QiniuJsSDK() {
887945 break ;
888946 default :
889947 errTip = "未知错误。" ;
948+ if ( ! unknow_error_retry ( file ) ) {
949+ return ;
950+ }
890951 break ;
891952 }
892953 errTip = errTip + '(' + err . status + ':' + errorText + ')' ;
@@ -906,6 +967,9 @@ function QiniuJsSDK() {
906967 break ;
907968 default :
908969 errTip = err . message + err . details ;
970+ if ( ! unknow_error_retry ( file ) ) {
971+ return ;
972+ }
909973 break ;
910974 }
911975 if ( _Error_Handler ) {
0 commit comments