@@ -2660,6 +2660,7 @@ class TFile {
26602660 this . fStreamers = 0 ;
26612661 this . fStreamerInfos = null ;
26622662 this . fFileName = '' ;
2663+ this . fTimeout = settings . FilesTimeout ?? 0 ;
26632664 this . fStreamers = [ ] ;
26642665 this . fBasicTypes = { } ; // custom basic types, in most case enumerations
26652666
@@ -2692,6 +2693,28 @@ class TFile {
26922693 this . fFileName = pos >= 0 ? this . fURL . slice ( pos + 1 ) : this . fURL ;
26932694 }
26942695
2696+ /** @summary Set timeout for File instance
2697+ * @desc Timeout used when submitting http requests to the server */
2698+ setTimeout ( v ) {
2699+ this . fTimeout = v ;
2700+ }
2701+
2702+ /** @summary Assign remap for web servers
2703+ * @desc Allows to specify fallback server if main server fails
2704+ * @param {Object } remap - looks like { 'https://original.server/': 'https://fallback.server/' } */
2705+ assignRemap ( remap ) {
2706+ if ( ! remap && ! isObject ( remap ) )
2707+ return ;
2708+
2709+ for ( const key in remap ) {
2710+ if ( this . fURL . indexOf ( key ) === 0 ) {
2711+ this . fURL2 = remap [ key ] + this . fURL . slice ( key . length ) ;
2712+ if ( ! this . fTimeout )
2713+ this . fTimeout = 10000 ;
2714+ }
2715+ }
2716+ }
2717+
26952718 /** @summary Assign BufferArray with file contentOpen file
26962719 * @private */
26972720 assignFileContent ( bufArray ) {
@@ -2719,15 +2742,23 @@ class TFile {
27192742 blobs = [ ] , // array of requested segments
27202743 promise = new Promise ( ( resolve , reject ) => { resolveFunc = resolve ; rejectFunc = reject ; } ) ;
27212744
2722- let fileurl = file . fURL ,
2723- first = 0 , last = 0 ,
2745+ let fileurl , first = 0 , last = 0 ,
27242746 // eslint-disable-next-line prefer-const
27252747 read_callback , first_req ,
27262748 first_block_retry = false ;
27272749
2728- if ( isStr ( filename ) && filename ) {
2729- const pos = fileurl . lastIndexOf ( '/' ) ;
2730- fileurl = ( pos < 0 ) ? filename : fileurl . slice ( 0 , pos + 1 ) + filename ;
2750+ function setFileUrl ( use_second ) {
2751+ if ( use_second ) {
2752+ console . log ( 'Failure - try to repait with URL2' , file . fURL2 ) ;
2753+ file . fURL = file . fURL2 ;
2754+ delete file . fURL2 ;
2755+ }
2756+
2757+ fileurl = file . fURL ;
2758+ if ( isStr ( filename ) && filename ) {
2759+ const pos = fileurl . lastIndexOf ( '/' ) ;
2760+ fileurl = ( pos < 0 ) ? filename : fileurl . slice ( 0 , pos + 1 ) + filename ;
2761+ }
27312762 }
27322763
27332764 function send_new_request ( increment ) {
@@ -2759,6 +2790,9 @@ class TFile {
27592790 xhr . expected_size = Math . max ( Math . round ( 1.1 * totalsz ) , totalsz + 200 ) ; // 200 if offset for the potential gzip
27602791 }
27612792
2793+ if ( file . fTimeout )
2794+ xhr . timeout = file . fTimeout ;
2795+
27622796 if ( isFunc ( progress_callback ) && isFunc ( xhr . addEventListener ) ) {
27632797 let sum1 = 0 , sum2 = 0 , sum_total = 0 ;
27642798 for ( let n = 1 ; n < place . length ; n += 2 ) {
@@ -2798,6 +2832,10 @@ class TFile {
27982832 file . fUseStampPar = false ;
27992833 return send_new_request ( ) ;
28002834 }
2835+ if ( file . fURL2 ) {
2836+ setFileUrl ( true ) ;
2837+ return send_new_request ( ) ;
2838+ }
28012839 if ( file . fAcceptRanges ) {
28022840 file . fAcceptRanges = false ;
28032841 first_block_retry = true ;
@@ -2850,6 +2888,11 @@ class TFile {
28502888 return send_new_request ( ) ;
28512889 }
28522890
2891+ if ( first_block && file . fURL2 ) {
2892+ setFileUrl ( true ) ;
2893+ return send_new_request ( ) ;
2894+ }
2895+
28532896 return rejectFunc ( Error ( 'Fail to read with several ranges' ) ) ;
28542897 }
28552898
@@ -2996,6 +3039,8 @@ class TFile {
29963039 send_new_request ( true ) ;
29973040 } ;
29983041
3042+ setFileUrl ( ) ;
3043+
29993044 return send_new_request ( true ) . then ( ( ) => promise ) ;
30003045 }
30013046
@@ -3865,8 +3910,10 @@ function openFile(arg) {
38653910 if ( ! file && isObject ( arg ) && arg . size && arg . name )
38663911 file = new TLocalFile ( arg ) ;
38673912
3868- if ( ! file )
3913+ if ( ! file ) {
38693914 file = new TFile ( arg ) ;
3915+ file . assignRemap ( settings . FilesRemap ) ;
3916+ }
38703917
38713918 return file . _open ( ) ;
38723919}
0 commit comments