@@ -10,6 +10,11 @@ const isNode = require('detect-node')
10
10
const path = require ( 'path' )
11
11
const fs = require ( 'fs' )
12
12
const os = require ( 'os' )
13
+ const http = require ( 'http' )
14
+ const https = require ( 'https' )
15
+ const each = require ( 'async/each' )
16
+ const waterfall = require ( 'async/waterfall' )
17
+ const parallel = require ( 'async/parallel' )
13
18
14
19
const IPFSApi = require ( '../src' )
15
20
const f = require ( './utils/factory' )
@@ -32,7 +37,8 @@ describe('.util', () => {
32
37
} )
33
38
} )
34
39
35
- after ( ( done ) => {
40
+ after ( function ( done ) {
41
+ this . timeout ( 10 * 1000 )
36
42
if ( ! ipfsd ) return done ( )
37
43
ipfsd . stop ( done )
38
44
} )
@@ -113,81 +119,243 @@ describe('.util', () => {
113
119
} )
114
120
115
121
describe ( '.urlAdd' , ( ) => {
116
- it ( 'http' , function ( done ) {
117
- this . timeout ( 40 * 1000 )
122
+ let testServers = [ ]
123
+
124
+ const sslOpts = {
125
+ key : fs . readFileSync ( path . join ( __dirname , 'fixtures' , 'ssl' , 'privkey.pem' ) ) ,
126
+ cert : fs . readFileSync ( path . join ( __dirname , 'fixtures' , 'ssl' , 'cert.pem' ) )
127
+ }
128
+
129
+ const startTestServer = ( handler , opts , cb ) => {
130
+ if ( typeof opts === 'function' ) {
131
+ cb = opts
132
+ opts = { }
133
+ }
134
+
135
+ const agent = opts . secure ? https : http
136
+ const serverOpts = opts . secure ? sslOpts : { }
137
+ const server = agent . createServer ( serverOpts , handler )
138
+
139
+ server . listen ( ( err ) => {
140
+ if ( err ) return cb ( err )
141
+ testServers . push ( server )
142
+ cb ( null , server )
143
+ } )
144
+ }
118
145
119
- ipfs . util . addFromURL ( 'http://example.com/' , ( err , result ) => {
120
- expect ( err ) . to . not . exist ( )
121
- expect ( result . length ) . to . equal ( 1 )
122
- done ( )
146
+ beforeEach ( ( ) => {
147
+ // Instructs node to not reject our snake oil SSL certificate when it
148
+ // can't verify the cerificate authority
149
+ process . env . NODE_TLS_REJECT_UNAUTHORIZED = 0
150
+ } )
151
+
152
+ afterEach ( ( done ) => {
153
+ // Reinstate unauthorised SSL cert rejection
154
+ process . env . NODE_TLS_REJECT_UNAUTHORIZED = 1
155
+
156
+ each ( testServers , ( server , cb ) => server . close ( cb ) , ( err ) => {
157
+ testServers = [ ]
158
+ done ( err )
123
159
} )
124
160
} )
125
161
126
- it ( 'https' , function ( done ) {
127
- this . timeout ( 40 * 1000 )
162
+ it ( 'http' , ( done ) => {
163
+ const handler = ( req , res ) => {
164
+ res . write ( `TEST${ Date . now ( ) } ` )
165
+ res . end ( )
166
+ }
128
167
129
- ipfs . util . addFromURL ( 'https://example.com/' , ( err , result ) => {
168
+ startTestServer ( handler , ( err , server ) => {
130
169
expect ( err ) . to . not . exist ( )
131
- expect ( result . length ) . to . equal ( 1 )
132
- done ( )
170
+
171
+ const url = `http://127.0.0.1:${ server . address ( ) . port } /`
172
+ ipfs . util . addFromURL ( url , ( err , result ) => {
173
+ expect ( err ) . to . not . exist ( )
174
+ expect ( result . length ) . to . equal ( 1 )
175
+ done ( )
176
+ } )
133
177
} )
134
178
} )
135
179
136
- it ( 'http with redirection' , function ( done ) {
137
- this . timeout ( 40 * 1000 )
180
+ it ( 'https' , ( done ) => {
181
+ const handler = ( req , res ) => {
182
+ res . write ( `TEST${ Date . now ( ) } ` )
183
+ res . end ( )
184
+ }
138
185
139
- ipfs . util . addFromURL ( 'http://covers.openlibrary.org/book/id/969165.jpg' , ( err , result ) => {
186
+ startTestServer ( handler , { secure : true } , ( err , server ) => {
140
187
expect ( err ) . to . not . exist ( )
141
- expect ( result [ 0 ] . hash ) . to . equal ( 'QmaL9zy7YUfvWmtD5ZXp42buP7P4xmZJWFkm78p8FJqgjg' )
142
- done ( )
188
+
189
+ const url = `https://127.0.0.1:${ server . address ( ) . port } /`
190
+ ipfs . util . addFromURL ( url , ( err , result ) => {
191
+ expect ( err ) . to . not . exist ( )
192
+ expect ( result . length ) . to . equal ( 1 )
193
+ done ( )
194
+ } )
143
195
} )
144
196
} )
145
197
146
- it ( 'https with redirection' , function ( done ) {
147
- this . timeout ( 40 * 1000 )
148
-
149
- ipfs . util . addFromURL ( 'https://coverartarchive.org/release/6e2a1694-d8b9-466a-aa33-b1077b2333c1' , ( err , result ) => {
198
+ it ( 'http with redirection' , ( done ) => {
199
+ const data = Buffer . from ( `TEST${ Date . now ( ) } ` )
200
+
201
+ waterfall ( [
202
+ ( cb ) => {
203
+ const handler = ( req , res ) => {
204
+ res . write ( data )
205
+ res . end ( )
206
+ }
207
+ startTestServer ( handler , cb )
208
+ } ,
209
+ ( serverA , cb ) => {
210
+ const url = `http://127.0.0.1:${ serverA . address ( ) . port } `
211
+ const handler = ( req , res ) => {
212
+ res . statusCode = 302
213
+ res . setHeader ( 'Location' , url )
214
+ res . end ( )
215
+ }
216
+ startTestServer ( handler , ( err , serverB ) => {
217
+ if ( err ) return cb ( err )
218
+ cb ( null , { a : serverA , b : serverB } )
219
+ } )
220
+ }
221
+ ] , ( err , servers ) => {
150
222
expect ( err ) . to . not . exist ( )
151
- expect ( result [ 0 ] . hash ) . to . equal ( 'QmSUdDvmXuq5YGrL4M3SEz7UZh5eT9WMuAsd9K34sambSj' )
152
- done ( )
223
+
224
+ ipfs . add ( data , ( err , res ) => {
225
+ expect ( err ) . to . not . exist ( )
226
+
227
+ const expectedHash = res [ 0 ] . hash
228
+ const url = `http://127.0.0.1:${ servers . b . address ( ) . port } `
229
+
230
+ ipfs . util . addFromURL ( url , ( err , result ) => {
231
+ expect ( err ) . to . not . exist ( )
232
+ expect ( result [ 0 ] . hash ) . to . equal ( expectedHash )
233
+ done ( )
234
+ } )
235
+ } )
153
236
} )
154
237
} )
155
238
156
- it ( 'with only-hash=true' , function ( ) {
157
- this . timeout ( 40 * 1000 )
239
+ it ( 'https with redirection' , ( done ) => {
240
+ const data = Buffer . from ( `TEST${ Date . now ( ) } ` )
241
+
242
+ waterfall ( [
243
+ ( cb ) => {
244
+ const handler = ( req , res ) => {
245
+ res . write ( data )
246
+ res . end ( )
247
+ }
248
+ startTestServer ( handler , { secure : true } , cb )
249
+ } ,
250
+ ( serverA , cb ) => {
251
+ const url = `https://127.0.0.1:${ serverA . address ( ) . port } `
252
+ const handler = ( req , res ) => {
253
+ res . statusCode = 302
254
+ res . setHeader ( 'Location' , url )
255
+ res . end ( )
256
+ }
257
+ startTestServer ( handler , { secure : true } , ( err , serverB ) => {
258
+ if ( err ) return cb ( err )
259
+ cb ( null , { a : serverA , b : serverB } )
260
+ } )
261
+ }
262
+ ] , ( err , servers ) => {
263
+ expect ( err ) . to . not . exist ( )
158
264
159
- return ipfs . util . addFromURL ( 'http://www.randomtext.me/#/gibberish' , { onlyHash : true } )
160
- . then ( out => expectTimeout ( ipfs . object . get ( out [ 0 ] . hash ) , 4000 ) )
265
+ ipfs . add ( data , ( err , res ) => {
266
+ expect ( err ) . to . not . exist ( )
267
+
268
+ const expectedHash = res [ 0 ] . hash
269
+ const url = `https://127.0.0.1:${ servers . b . address ( ) . port } `
270
+
271
+ ipfs . util . addFromURL ( url , ( err , result ) => {
272
+ expect ( err ) . to . not . exist ( )
273
+ expect ( result [ 0 ] . hash ) . to . equal ( expectedHash )
274
+ done ( )
275
+ } )
276
+ } )
277
+ } )
161
278
} )
162
279
163
- it ( 'with wrap-with-directory=true' , function ( done ) {
164
- this . timeout ( 40 * 1000 )
280
+ it ( 'with only-hash=true' , ( done ) => {
281
+ const handler = ( req , res ) => {
282
+ res . write ( `TEST${ Date . now ( ) } ` )
283
+ res . end ( )
284
+ }
165
285
166
- ipfs . util . addFromURL ( 'http://ipfs.io/ipfs/QmWjppACLcFLQ2qL38unKQvJBhXH3RUtcGLPk7zmrTwV61/969165.jpg?foo=bar#buzz' , {
167
- wrapWithDirectory : true
168
- } , ( err , result ) => {
286
+ startTestServer ( handler , ( err , server ) => {
169
287
expect ( err ) . to . not . exist ( )
170
- expect ( result [ 0 ] . hash ) . to . equal ( 'QmaL9zy7YUfvWmtD5ZXp42buP7P4xmZJWFkm78p8FJqgjg' )
171
- expect ( result [ 0 ] . path ) . to . equal ( '969165.jpg' )
172
- expect ( result [ 1 ] . hash ) . to . equal ( 'QmWjppACLcFLQ2qL38unKQvJBhXH3RUtcGLPk7zmrTwV61' )
173
- expect ( result . length ) . to . equal ( 2 )
174
- done ( )
288
+
289
+ const url = `http://127.0.0.1:${ server . address ( ) . port } /`
290
+
291
+ ipfs . util . addFromURL ( url , { onlyHash : true } , ( err , res ) => {
292
+ expect ( err ) . to . not . exist ( )
293
+
294
+ // A successful object.get for this size data took my laptop ~14ms
295
+ let didTimeout = false
296
+ const timeoutId = setTimeout ( ( ) => {
297
+ didTimeout = true
298
+ done ( )
299
+ } , 500 )
300
+
301
+ ipfs . object . get ( res [ 0 ] . hash , ( ) => {
302
+ clearTimeout ( timeoutId )
303
+ if ( didTimeout ) return
304
+ expect ( new Error ( 'did not timeout' ) ) . to . not . exist ( )
305
+ } )
306
+ } )
175
307
} )
176
308
} )
177
309
178
- it ( 'with wrap-with-directory=true and URL-escaped file name' , function ( done ) {
179
- this . timeout ( 40 * 1000 )
310
+ it ( 'with wrap-with-directory=true' , ( done ) => {
311
+ const filename = `TEST${ Date . now ( ) } .txt`
312
+ const data = Buffer . from ( `TEST${ Date . now ( ) } ` )
313
+
314
+ parallel ( {
315
+ server : ( cb ) => startTestServer ( ( req , res ) => {
316
+ res . write ( data )
317
+ res . end ( )
318
+ } , cb ) ,
319
+ expectedResult : ( cb ) => {
320
+ ipfs . add ( [ { path : filename , content : data } ] , { wrapWithDirectory : true } , cb )
321
+ }
322
+ } , ( err , taskResult ) => {
323
+ expect ( err ) . to . not . exist ( )
324
+
325
+ const { server, expectedResult } = taskResult
326
+ const url = `http://127.0.0.1:${ server . address ( ) . port } /${ filename } ?foo=bar#buzz`
327
+
328
+ ipfs . util . addFromURL ( url , { wrapWithDirectory : true } , ( err , result ) => {
329
+ expect ( err ) . to . not . exist ( )
330
+ expect ( result ) . to . deep . equal ( expectedResult )
331
+ done ( )
332
+ } )
333
+ } )
334
+ } )
180
335
181
- // Sample URL contains URL-escaped ( ) and local diacritics
182
- ipfs . util . addFromURL ( 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Doma%C5%BElice%2C_Jir%C3%A1skova_43_%289102%29.jpg/320px-Doma%C5%BElice%2C_Jir%C3%A1skova_43_%289102%29.jpg?foo=bar#buzz' , {
183
- wrapWithDirectory : true
184
- } , ( err , result ) => {
336
+ it ( 'with wrap-with-directory=true and URL-escaped file name' , ( done ) => {
337
+ const filename = '320px-Domažlice,_Jiráskova_43_(9102).jpg'
338
+ const data = Buffer . from ( `TEST${ Date . now ( ) } ` )
339
+
340
+ parallel ( {
341
+ server : ( cb ) => startTestServer ( ( req , res ) => {
342
+ res . write ( data )
343
+ res . end ( )
344
+ } , cb ) ,
345
+ expectedResult : ( cb ) => {
346
+ ipfs . add ( [ { path : filename , content : data } ] , { wrapWithDirectory : true } , cb )
347
+ }
348
+ } , ( err , taskResult ) => {
185
349
expect ( err ) . to . not . exist ( )
186
- expect ( result [ 0 ] . hash ) . to . equal ( 'QmRJ9ExxSMV4BLF9ZJUb2mLngupm6BXZEek755VHGTJo2Y' )
187
- expect ( result [ 0 ] . path ) . to . equal ( '320px-Domažlice,_Jiráskova_43_(9102).jpg' )
188
- expect ( result [ 1 ] . hash ) . to . equal ( 'QmbxsHFU3sCfr8wszDHuDLA76C2xCv9HT8L3aC1pBwgaHk' )
189
- expect ( result . length ) . to . equal ( 2 )
190
- done ( )
350
+
351
+ const { server, expectedResult } = taskResult
352
+ const url = `http://127.0.0.1:${ server . address ( ) . port } /${ encodeURIComponent ( filename ) } ?foo=bar#buzz`
353
+
354
+ ipfs . util . addFromURL ( url , { wrapWithDirectory : true } , ( err , result ) => {
355
+ expect ( err ) . to . not . exist ( )
356
+ expect ( result ) . to . deep . equal ( expectedResult )
357
+ done ( )
358
+ } )
191
359
} )
192
360
} )
193
361
0 commit comments