From fe3a56ff6ffe358234a68febd5797524a1502e76 Mon Sep 17 00:00:00 2001 From: Zachary Seguin Date: Sat, 27 Oct 2018 23:44:52 -0400 Subject: [PATCH] Download empty files (Fixes #102) --- pipeline/pipeline.go | 5 ++++ sources/http.go | 64 +++++++++++++++++++++++--------------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/pipeline/pipeline.go b/pipeline/pipeline.go index f82ae57..4d46b8e 100644 --- a/pipeline/pipeline.go +++ b/pipeline/pipeline.go @@ -229,6 +229,11 @@ func ConstructPartsQueue(size uint64, blockSize uint64, sourceURI string, target var bsib = blockSize numOfBlocks = int((size + (bsib - 1)) / bsib) + // Have at least 1 block. + if numOfBlocks == 0 { + numOfBlocks = 1 + } + parts = make([]Part, numOfBlocks) var curFileOffset uint64 diff --git a/sources/http.go b/sources/http.go index fdc35ce..8ba8f00 100644 --- a/sources/http.go +++ b/sources/http.go @@ -161,46 +161,48 @@ func (f *HTTPSource) ExecuteReader(partitionsQ chan pipeline.PartsPartition, par return // no more blocks of file data to be read } - util.RetriableOperation(func(r int) error { - if req, err = http.NewRequest("GET", p.SourceURI, nil); err != nil { - log.Fatal(err) - } + if p.BytesToRead > 0 { + util.RetriableOperation(func(r int) error { + if req, err = http.NewRequest("GET", p.SourceURI, nil); err != nil { + log.Fatal(err) + } - header := fmt.Sprintf("bytes=%v-%v", p.Offset, p.Offset-1+uint64(p.BytesToRead)) - req.Header.Set("Range", header) - req.Header.Set("User-Agent", internal.UserAgentStr) + header := fmt.Sprintf("bytes=%v-%v", p.Offset, p.Offset-1+uint64(p.BytesToRead)) + req.Header.Set("Range", header) + req.Header.Set("User-Agent", internal.UserAgentStr) - if res, err = f.HTTPClient.Do(req); err != nil || res.StatusCode != 206 { - var status int - if res != nil { - status = res.StatusCode - err = fmt.Errorf("Invalid status code in the response. Status: %v Bytes: %v", status, header) - } + if res, err = f.HTTPClient.Do(req); err != nil || res.StatusCode != 206 { + var status int + if res != nil { + status = res.StatusCode + err = fmt.Errorf("Invalid status code in the response. Status: %v Bytes: %v", status, header) + } - if res != nil && res.Body != nil { - res.Body.Close() - } + if res != nil && res.Body != nil { + res.Body.Close() + } - util.PrintfIfDebug("ExecuteReader -> blockid:%v toread:%v status:%v err:%v head:%v", p.BlockID, p.BytesToRead, status, err, header) + util.PrintfIfDebug("ExecuteReader -> blockid:%v toread:%v status:%v err:%v head:%v", p.BlockID, p.BytesToRead, status, err, header) - return err - } - p.Data, err = ioutil.ReadAll(res.Body) - //_, err = io.ReadFull(res.Body, p.Data[:p.BytesToRead]) + return err + } + p.Data, err = ioutil.ReadAll(res.Body) + //_, err = io.ReadFull(res.Body, p.Data[:p.BytesToRead]) - res.Body.Close() - if err != nil { - return err - } + res.Body.Close() + if err != nil { + return err + } - if f.includeMD5 { - p.MD5() - } + if f.includeMD5 { + p.MD5() + } - util.PrintfIfDebug("ExecuteReader -> blockid:%v toread:%v status:%v read:%v head:%v", p.BlockID, p.BytesToRead, res.StatusCode, res.ContentLength, header) + util.PrintfIfDebug("ExecuteReader -> blockid:%v toread:%v status:%v read:%v head:%v", p.BlockID, p.BytesToRead, res.StatusCode, res.ContentLength, header) - return nil - }) + return nil + }) + } readPartsQ <- p blocksHandled++