25
25
import java .io .RandomAccessFile ;
26
26
import java .util .Date ;
27
27
import java .util .HashMap ;
28
+ import java .util .List ;
28
29
import java .util .Map ;
29
30
30
31
import org .apache .cloudstack .managed .context .ManagedContextRunnable ;
@@ -73,6 +74,7 @@ public class SimpleHttpMultiFileDownloader extends ManagedContextRunnable implem
73
74
private final HttpMethodRetryHandler retryHandler ;
74
75
75
76
private HashMap <String , String > urlFileMap ;
77
+ private boolean followRedirects = false ;
76
78
77
79
public SimpleHttpMultiFileDownloader (StorageLayer storageLayer , String [] downloadUrls , String toDir ,
78
80
DownloadCompleteCallback callback , long maxTemplateSizeInBytes ,
@@ -94,7 +96,7 @@ public SimpleHttpMultiFileDownloader(StorageLayer storageLayer, String[] downloa
94
96
private GetMethod createRequest (String downloadUrl ) {
95
97
GetMethod request = new GetMethod (downloadUrl );
96
98
request .getParams ().setParameter (HttpMethodParams .RETRY_HANDLER , retryHandler );
97
- request .setFollowRedirects (true );
99
+ request .setFollowRedirects (followRedirects );
98
100
return request ;
99
101
}
100
102
@@ -170,7 +172,7 @@ private long downloadFile(String downloadUrl) {
170
172
urlFileMap .put (downloadUrl , currentToFile );
171
173
file = new File (currentToFile );
172
174
long localFileSize = checkLocalFileSizeForResume (resume , file );
173
- if (checkServerResponse (localFileSize )) return 0 ;
175
+ if (checkServerResponse (localFileSize , downloadUrl )) return 0 ;
174
176
if (!tryAndGetRemoteSize ()) return 0 ;
175
177
if (!canHandleDownloadSize ()) return 0 ;
176
178
checkAndSetDownloadSize ();
@@ -317,7 +319,7 @@ private boolean tryAndGetRemoteSize() {
317
319
return true ;
318
320
}
319
321
320
- private boolean checkServerResponse (long localFileSize ) throws IOException {
322
+ private boolean checkServerResponse (long localFileSize , String downloadUrl ) throws IOException {
321
323
int responseCode = 0 ;
322
324
323
325
if (localFileSize > 0 ) {
@@ -331,6 +333,12 @@ private boolean checkServerResponse(long localFileSize) throws IOException {
331
333
} else if ((responseCode = client .executeMethod (request )) != HttpStatus .SC_OK ) {
332
334
currentStatus = Status .UNRECOVERABLE_ERROR ;
333
335
errorString = " HTTP Server returned " + responseCode + " (expected 200 OK) " ;
336
+ if (List .of (HttpStatus .SC_MOVED_PERMANENTLY , HttpStatus .SC_MOVED_TEMPORARILY ).contains (responseCode )
337
+ && !followRedirects ) {
338
+ errorString = String .format ("Failed to download %s due to redirection, response code: %d" ,
339
+ downloadUrl , responseCode );
340
+ s_logger .error (errorString );
341
+ }
334
342
return true ; //FIXME: retry?
335
343
}
336
344
return false ;
@@ -478,4 +486,12 @@ public DownloadCommand.ResourceType getResourceType() {
478
486
public Map <String , String > getDownloadedFilesMap () {
479
487
return urlFileMap ;
480
488
}
489
+
490
+ @ Override
491
+ public void setFollowRedirects (boolean followRedirects ) {
492
+ this .followRedirects = followRedirects ;
493
+ if (this .request != null ) {
494
+ this .request .setFollowRedirects (followRedirects );
495
+ }
496
+ }
481
497
}
0 commit comments