@@ -2646,6 +2646,7 @@ class TFile {
26462646 this . fStreamers = 0 ;
26472647 this . fStreamerInfos = null ;
26482648 this . fFileName = '' ;
2649+ this . fTimeout = settings . FilesTimeout ?? 0 ;
26492650 this . fStreamers = [ ] ;
26502651 this . fBasicTypes = { } ; // custom basic types, in most case enumerations
26512652
@@ -2678,6 +2679,28 @@ class TFile {
26782679 this . fFileName = pos >= 0 ? this . fURL . slice ( pos + 1 ) : this . fURL ;
26792680 }
26802681
2682+ /** @summary Set timeout for File instance
2683+ * @desc Timeout used when submitting http requests to the server */
2684+ setTimeout ( v ) {
2685+ this . fTimeout = v ;
2686+ }
2687+
2688+ /** @summary Assign remap for web servers
2689+ * @desc Allows to specify fallback server if main server fails
2690+ * @param {Object } remap - looks like { 'https://original.server/': 'https://fallback.server/' } */
2691+ assignRemap ( remap ) {
2692+ if ( ! remap && ! isObject ( remap ) )
2693+ return ;
2694+
2695+ for ( const key in remap ) {
2696+ if ( this . fURL . indexOf ( key ) === 0 ) {
2697+ this . fURL2 = remap [ key ] + this . fURL . slice ( key . length ) ;
2698+ if ( ! this . fTimeout )
2699+ this . fTimeout = 10000 ;
2700+ }
2701+ }
2702+ }
2703+
26812704 /** @summary Assign BufferArray with file contentOpen file
26822705 * @private */
26832706 assignFileContent ( bufArray ) {
@@ -2705,15 +2728,23 @@ class TFile {
27052728 blobs = [ ] , // array of requested segments
27062729 promise = new Promise ( ( resolve , reject ) => { resolveFunc = resolve ; rejectFunc = reject ; } ) ;
27072730
2708- let fileurl = file . fURL ,
2709- first = 0 , last = 0 ,
2731+ let fileurl , first = 0 , last = 0 ,
27102732 // eslint-disable-next-line prefer-const
27112733 read_callback , first_req ,
27122734 first_block_retry = false ;
27132735
2714- if ( isStr ( filename ) && filename ) {
2715- const pos = fileurl . lastIndexOf ( '/' ) ;
2716- fileurl = ( pos < 0 ) ? filename : fileurl . slice ( 0 , pos + 1 ) + filename ;
2736+ function setFileUrl ( use_second ) {
2737+ if ( use_second ) {
2738+ console . log ( 'Failure - try to repait with URL2' , file . fURL2 ) ;
2739+ file . fURL = file . fURL2 ;
2740+ delete file . fURL2 ;
2741+ }
2742+
2743+ fileurl = file . fURL ;
2744+ if ( isStr ( filename ) && filename ) {
2745+ const pos = fileurl . lastIndexOf ( '/' ) ;
2746+ fileurl = ( pos < 0 ) ? filename : fileurl . slice ( 0 , pos + 1 ) + filename ;
2747+ }
27172748 }
27182749
27192750 function send_new_request ( increment ) {
@@ -2745,6 +2776,9 @@ class TFile {
27452776 xhr . expected_size = Math . max ( Math . round ( 1.1 * totalsz ) , totalsz + 200 ) ; // 200 if offset for the potential gzip
27462777 }
27472778
2779+ if ( file . fTimeout )
2780+ xhr . timeout = file . fTimeout ;
2781+
27482782 if ( isFunc ( progress_callback ) && isFunc ( xhr . addEventListener ) ) {
27492783 let sum1 = 0 , sum2 = 0 , sum_total = 0 ;
27502784 for ( let n = 1 ; n < place . length ; n += 2 ) {
@@ -2784,6 +2818,10 @@ class TFile {
27842818 file . fUseStampPar = false ;
27852819 return send_new_request ( ) ;
27862820 }
2821+ if ( file . fURL2 ) {
2822+ setFileUrl ( true ) ;
2823+ return send_new_request ( ) ;
2824+ }
27872825 if ( file . fAcceptRanges ) {
27882826 file . fAcceptRanges = false ;
27892827 first_block_retry = true ;
@@ -2836,6 +2874,11 @@ class TFile {
28362874 return send_new_request ( ) ;
28372875 }
28382876
2877+ if ( first_block && file . fURL2 ) {
2878+ setFileUrl ( true ) ;
2879+ return send_new_request ( ) ;
2880+ }
2881+
28392882 return rejectFunc ( Error ( 'Fail to read with several ranges' ) ) ;
28402883 }
28412884
@@ -2982,6 +3025,8 @@ class TFile {
29823025 send_new_request ( true ) ;
29833026 } ;
29843027
3028+ setFileUrl ( ) ;
3029+
29853030 return send_new_request ( true ) . then ( ( ) => promise ) ;
29863031 }
29873032
@@ -3850,8 +3895,10 @@ function openFile(arg) {
38503895 if ( ! file && isObject ( arg ) && arg . size && arg . name )
38513896 file = new TLocalFile ( arg ) ;
38523897
3853- if ( ! file )
3898+ if ( ! file ) {
38543899 file = new TFile ( arg ) ;
3900+ file . assignRemap ( settings . FilesRemap ) ;
3901+ }
38553902
38563903 return file . _open ( ) ;
38573904}
0 commit comments