@@ -25,28 +25,41 @@ module.exports = (arg) => {
25
25
opts = { }
26
26
}
27
27
28
- if ( typeof url !== 'string' ||
29
- ! url . startsWith ( 'http' ) ) {
28
+ if ( ! validUrl ( url ) ) {
30
29
return callback ( new Error ( '"url" param must be an http(s) url' ) )
31
30
}
32
31
33
32
callback = once ( callback )
34
33
35
- request ( parseUrl ( url ) . protocol ) ( url , ( res ) => {
36
- res . once ( 'error' , callback )
37
- if ( res . statusCode >= 400 ) {
38
- return callback ( new Error ( `Failed to download with ${ res . statusCode } ` ) )
39
- }
34
+ requestWithRedirect ( url , opts , send , callback )
35
+ } )
36
+ }
37
+
38
+ const validUrl = ( url ) => typeof url === 'string' && url . startsWith ( 'http' )
39
+
40
+ const requestWithRedirect = ( url , opts , send , callback ) => {
41
+ request ( parseUrl ( url ) . protocol ) ( url , ( res ) => {
42
+ res . once ( 'error' , callback )
43
+ if ( res . statusCode >= 400 ) {
44
+ return callback ( new Error ( `Failed to download with ${ res . statusCode } ` ) )
45
+ }
40
46
47
+ const redirection = res . headers . location
48
+
49
+ if ( redirection ) {
50
+ if ( ! validUrl ( redirection ) ) {
51
+ return callback ( new Error ( 'redirection url must be an http(s) url' ) )
52
+ }
53
+ requestWithRedirect ( redirection , opts , send , callback )
54
+ } else {
41
55
const params = {
42
56
path : 'add' ,
43
57
qs : opts ,
44
58
files : res
45
59
}
46
-
47
60
// Transform the response stream to DAGNode values
48
61
const transform = ( res , callback ) => DAGNodeStream . streamToValue ( send , res , callback )
49
62
send . andTransform ( params , transform , callback )
50
- } ) . end ( )
51
- } )
63
+ }
64
+ } ) . end ( )
52
65
}
0 commit comments