@@ -222,6 +222,57 @@ func TestHttpGetter_resume(t *testing.T) {
222
222
}
223
223
}
224
224
225
+ // The server may support Byte-Range, but has no size for the requested object
226
+ func TestHttpGetter_resumeNoRange (t * testing.T ) {
227
+ load := []byte (testHttpMetaStr )
228
+ sha := sha256 .New ()
229
+ if n , err := sha .Write (load ); n != len (load ) || err != nil {
230
+ t .Fatalf ("sha write failed: %d, %s" , n , err )
231
+ }
232
+ checksum := hex .EncodeToString (sha .Sum (nil ))
233
+ downloadFrom := len (load ) / 2
234
+
235
+ ln := testHttpServer (t )
236
+ defer ln .Close ()
237
+
238
+ dst := tempDir (t )
239
+ defer os .RemoveAll (dst )
240
+
241
+ dst = filepath .Join (dst , ".." , "range" )
242
+ f , err := os .Create (dst )
243
+ if err != nil {
244
+ t .Fatalf ("create: %v" , err )
245
+ }
246
+ if n , err := f .Write (load [:downloadFrom ]); n != downloadFrom || err != nil {
247
+ t .Fatalf ("partial file write failed: %d, %s" , n , err )
248
+ }
249
+ if err := f .Close (); err != nil {
250
+ t .Fatalf ("close failed: %s" , err )
251
+ }
252
+
253
+ u := url.URL {
254
+ Scheme : "http" ,
255
+ Host : ln .Addr ().String (),
256
+ Path : "/no-range" ,
257
+ RawQuery : "checksum=" + checksum ,
258
+ }
259
+ t .Logf ("url: %s" , u .String ())
260
+
261
+ // Finish getting it!
262
+ if err := GetFile (dst , u .String ()); err != nil {
263
+ t .Fatalf ("finishing download should not error: %v" , err )
264
+ }
265
+
266
+ b , err := ioutil .ReadFile (dst )
267
+ if err != nil {
268
+ t .Fatalf ("readfile failed: %v" , err )
269
+ }
270
+
271
+ if string (b ) != string (load ) {
272
+ t .Fatalf ("file differs: got:\n %s\n expected:\n %s\n " , string (b ), string (load ))
273
+ }
274
+ }
275
+
225
276
func TestHttpGetter_file (t * testing.T ) {
226
277
ln := testHttpServer (t )
227
278
defer ln .Close ()
@@ -351,6 +402,7 @@ func testHttpServer(t *testing.T) net.Listener {
351
402
mux .HandleFunc ("/meta-subdir" , testHttpHandlerMetaSubdir )
352
403
mux .HandleFunc ("/meta-subdir-glob" , testHttpHandlerMetaSubdirGlob )
353
404
mux .HandleFunc ("/range" , testHttpHandlerRange )
405
+ mux .HandleFunc ("/no-range" , testHttpHandlerNoRange )
354
406
355
407
var server http.Server
356
408
server .Handler = mux
@@ -428,6 +480,20 @@ func testHttpHandlerRange(w http.ResponseWriter, r *http.Request) {
428
480
}
429
481
}
430
482
483
+ func testHttpHandlerNoRange (w http.ResponseWriter , r * http.Request ) {
484
+ load := []byte (testHttpMetaStr )
485
+ switch r .Method {
486
+ case "HEAD" :
487
+ // we support range, but the object size isn't known
488
+ w .Header ().Add ("accept-ranges" , "bytes" )
489
+ default :
490
+ if r .Header .Get ("Range" ) != "" {
491
+ http .Error (w , "range not supported" , http .StatusBadRequest )
492
+ }
493
+ w .Write (load )
494
+ }
495
+ }
496
+
431
497
const testHttpMetaStr = `
432
498
<html>
433
499
<head>
0 commit comments