From 4b2bf10848523f921085e8b72b84e0b7b0b6daa5 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:14:29 +0900 Subject: [PATCH 01/12] Add README.md --- kadai3-2/hioki-daichi/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 kadai3-2/hioki-daichi/README.md diff --git a/kadai3-2/hioki-daichi/README.md b/kadai3-2/hioki-daichi/README.md new file mode 100644 index 0000000..3d8c456 --- /dev/null +++ b/kadai3-2/hioki-daichi/README.md @@ -0,0 +1 @@ +# parallel-download From b172da1a28390df5b670598f4252ce7595f162fb Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:14:37 +0900 Subject: [PATCH 02/12] Add .gitignore --- kadai3-2/hioki-daichi/.gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 kadai3-2/hioki-daichi/.gitignore diff --git a/kadai3-2/hioki-daichi/.gitignore b/kadai3-2/hioki-daichi/.gitignore new file mode 100644 index 0000000..711ebad --- /dev/null +++ b/kadai3-2/hioki-daichi/.gitignore @@ -0,0 +1,3 @@ +/parallel-download +/coverage/ +/vendor/ From 1f8a7bd1e440f8745c29871efaed0daa91bde8dd Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:14:44 +0900 Subject: [PATCH 03/12] Add LICENSE --- kadai3-2/hioki-daichi/LICENSE | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 kadai3-2/hioki-daichi/LICENSE diff --git a/kadai3-2/hioki-daichi/LICENSE b/kadai3-2/hioki-daichi/LICENSE new file mode 100644 index 0000000..218ee44 --- /dev/null +++ b/kadai3-2/hioki-daichi/LICENSE @@ -0,0 +1,2 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 From cafe3680701612fd79b56c841e5e8de527c62f55 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:15:04 +0900 Subject: [PATCH 04/12] $ dep init --- kadai3-2/hioki-daichi/Gopkg.lock | 9 +++++++++ kadai3-2/hioki-daichi/Gopkg.toml | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 kadai3-2/hioki-daichi/Gopkg.lock create mode 100644 kadai3-2/hioki-daichi/Gopkg.toml diff --git a/kadai3-2/hioki-daichi/Gopkg.lock b/kadai3-2/hioki-daichi/Gopkg.lock new file mode 100644 index 0000000..10ef811 --- /dev/null +++ b/kadai3-2/hioki-daichi/Gopkg.lock @@ -0,0 +1,9 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/kadai3-2/hioki-daichi/Gopkg.toml b/kadai3-2/hioki-daichi/Gopkg.toml new file mode 100644 index 0000000..d7072c2 --- /dev/null +++ b/kadai3-2/hioki-daichi/Gopkg.toml @@ -0,0 +1,30 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + + +[prune] + go-tests = true + unused-packages = true From 64178e1c516615f8ecfd9a9865f7d9378ca742b5 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:15:18 +0900 Subject: [PATCH 05/12] Add Makefile --- kadai3-2/hioki-daichi/Makefile | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 kadai3-2/hioki-daichi/Makefile diff --git a/kadai3-2/hioki-daichi/Makefile b/kadai3-2/hioki-daichi/Makefile new file mode 100644 index 0000000..e4365c4 --- /dev/null +++ b/kadai3-2/hioki-daichi/Makefile @@ -0,0 +1,25 @@ +GOCMD=go +GOBUILD=$(GOCMD) build +GOCLEAN=$(GOCMD) clean +GOTEST=$(GOCMD) test +GOTOOL=$(GOCMD) tool +GODOCCMD=godoc +GODOCPORT=6060 +BINARY_NAME=parallel-download + +all: test build +build: + dep ensure + $(GOBUILD) -o $(BINARY_NAME) -v +test: + $(GOTEST) ./... +cov: + $(GOTEST) ./... -race -coverprofile=coverage/c.out -covermode=atomic + $(GOTOOL) cover -html=coverage/c.out -o coverage/index.html + open coverage/index.html +clean: + $(GOCLEAN) + rm -f $(BINARY_NAME) +doc: + (sleep 1; open http://localhost:$(GODOCPORT)/pkg/github.com/gopherdojo/dojo3) & + $(GODOCCMD) -http ":$(GODOCPORT)" From ca9468341368859e960b8eb40694a5f8553446c5 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:16:35 +0900 Subject: [PATCH 06/12] Add opt package --- kadai3-2/hioki-daichi/opt/opt.go | 56 +++++++++++++++++++++ kadai3-2/hioki-daichi/opt/opt_test.go | 71 +++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 kadai3-2/hioki-daichi/opt/opt.go create mode 100644 kadai3-2/hioki-daichi/opt/opt_test.go diff --git a/kadai3-2/hioki-daichi/opt/opt.go b/kadai3-2/hioki-daichi/opt/opt.go new file mode 100644 index 0000000..64382fe --- /dev/null +++ b/kadai3-2/hioki-daichi/opt/opt.go @@ -0,0 +1,56 @@ +/* +Package opt deals with CLI options. +*/ +package opt + +import ( + "errors" + "flag" + "net/url" + "path" + "time" +) + +var errExist = errors.New("file already exists") + +// Options has the options required for parallel-download. +type Options struct { + Parallelism int + Output string + URL *url.URL + Timeout time.Duration +} + +// Parse parses args and returns Options. +func Parse(args ...string) (*Options, error) { + flg := flag.NewFlagSet("parallel-download", flag.ExitOnError) + + parallelism := flg.Int("p", 8, "Download files in parallel according to the specified number.") + output := flg.String("o", "", "Save the downloaded file in the specified path. (Overwrite if duplicates.)") + timeout := flg.Duration("t", 30*time.Second, "Terminate when the specified value has elapsed since download started.") + + flg.Parse(args) + + u, err := url.ParseRequestURI(flg.Arg(0)) + if err != nil { + return nil, err + } + + if *output == "" { + _, filename := path.Split(u.Path) + + // Inspired by the --default-page option of wget + if filename == "" { + filename = "index.html" + } + + *output = filename + } + + return &Options{ + Parallelism: *parallelism, + Output: *output, + URL: u, + Timeout: *timeout, + }, nil +} diff --git a/kadai3-2/hioki-daichi/opt/opt_test.go b/kadai3-2/hioki-daichi/opt/opt_test.go new file mode 100644 index 0000000..0733a79 --- /dev/null +++ b/kadai3-2/hioki-daichi/opt/opt_test.go @@ -0,0 +1,71 @@ +package opt + +import ( + "net/url" + "reflect" + "testing" +) + +func TestMain_parse(t *testing.T) { + cases := map[string]struct { + args []string + expectedParallelism int + expectedOutput string + expectedURLString string + }{ + "no options": {args: []string{"http://example.com/foo.png"}, expectedParallelism: 8, expectedOutput: "foo.png", expectedURLString: "http://example.com/foo.png"}, + "-p=2": {args: []string{"-p=2", "http://example.com/foo.png"}, expectedParallelism: 2, expectedOutput: "foo.png", expectedURLString: "http://example.com/foo.png"}, + "-o=bar.png": {args: []string{"-o=bar.png", "http://example.com/foo.png"}, expectedParallelism: 8, expectedOutput: "bar.png", expectedURLString: "http://example.com/foo.png"}, + "index.html": {args: []string{"http://example.com/"}, expectedParallelism: 8, expectedOutput: "index.html", expectedURLString: "http://example.com/"}, + } + + for n, c := range cases { + c := c + t.Run(n, func(t *testing.T) { + args := c.args + expectedParallelism := c.expectedParallelism + expectedOutput := c.expectedOutput + expectedURL, err := url.ParseRequestURI(c.expectedURLString) + if err != nil { + t.Fatalf("err %s", err) + } + + opts, err := Parse(args...) + if err != nil { + t.Fatalf("err %s", err) + } + + actualParallelism := opts.Parallelism + actualOutput := opts.Output + actualURL := opts.URL + + if actualParallelism != expectedParallelism { + t.Errorf(`unexpected parallelism: expected: %d actual: %d`, expectedParallelism, actualParallelism) + } + + if actualOutput != expectedOutput { + t.Errorf(`unexpected output: expected: "%s" actual: "%s"`, expectedOutput, actualOutput) + } + + if !reflect.DeepEqual(actualURL, expectedURL) { + t.Errorf(`unexpected URL: expected: "%s" actual: "%s"`, expectedURL, actualURL) + } + }) + } +} + +func TestMain_parse_InvalidURL(t *testing.T) { + t.Parallel() + + expected := "parse %: invalid URI for request" + + _, err := Parse([]string{"%"}...) + if err == nil { + t.Fatal("Unexpectedly err was nil") + } + + actual := err.Error() + if actual != expected { + t.Errorf(`unexpected error: expected: "%s" actual: "%s"`, expected, actual) + } +} From 0ddf69b449fdd85961e2fce4185c5214785bf423 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:17:48 +0900 Subject: [PATCH 07/12] Add termination package --- .../hioki-daichi/termination/termination.go | 42 +++++++++++++++++++ .../termination/termination_test.go | 36 ++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 kadai3-2/hioki-daichi/termination/termination.go create mode 100644 kadai3-2/hioki-daichi/termination/termination_test.go diff --git a/kadai3-2/hioki-daichi/termination/termination.go b/kadai3-2/hioki-daichi/termination/termination.go new file mode 100644 index 0000000..b2b2b6c --- /dev/null +++ b/kadai3-2/hioki-daichi/termination/termination.go @@ -0,0 +1,42 @@ +/* +Package termination deals with Ctrl+C termination. +*/ +package termination + +import ( + "context" + "fmt" + "io" + "os" + "os/signal" + "syscall" +) + +var cleanFns []func() + +// for testing +var osExit = os.Exit + +// Listen listens signals. +func Listen(ctx context.Context, w io.Writer) (context.Context, func()) { + ctx, cancel := context.WithCancel(ctx) + + ch := make(chan os.Signal, 2) + signal.Notify(ch, os.Interrupt, syscall.SIGTERM) + go func() { + <-ch + fmt.Fprintln(w, "\rCtrl+C pressed in Terminal") + cancel() + for _, f := range cleanFns { + f() + } + osExit(0) + }() + + return ctx, cancel +} + +// CleanFunc registers clean function. +func CleanFunc(f func()) { + cleanFns = append(cleanFns, f) +} diff --git a/kadai3-2/hioki-daichi/termination/termination_test.go b/kadai3-2/hioki-daichi/termination/termination_test.go new file mode 100644 index 0000000..d78d5f1 --- /dev/null +++ b/kadai3-2/hioki-daichi/termination/termination_test.go @@ -0,0 +1,36 @@ +package termination + +import ( + "context" + "io/ioutil" + "os" + "testing" + "time" +) + +func TestTermination_Listen(t *testing.T) { + CleanFunc(func() {}) + + doneCh := make(chan struct{}) + osExit = func(code int) { doneCh <- struct{}{} } + + _, clean := Listen(context.Background(), ioutil.Discard) + defer clean() + + proc, err := os.FindProcess(os.Getpid()) + if err != nil { + t.Fatalf("err %s", err) + } + + err = proc.Signal(os.Interrupt) + if err != nil { + t.Fatalf("err %s", err) + } + + select { + case <-doneCh: + return + case <-time.After(100 * time.Millisecond): + t.Fatal("timeout") + } +} From f139615cd69587efe45670845da690e2e32dff55 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:20:23 +0900 Subject: [PATCH 08/12] Add downloading package --- kadai3-2/hioki-daichi/Gopkg.lock | 18 +- .../hioki-daichi/downloading/downloading.go | 309 ++++++++++++++++++ .../downloading/downloading_test.go | 308 +++++++++++++++++ .../hioki-daichi/downloading/testdata/a.txt | 1 + .../hioki-daichi/downloading/testdata/b.txt | 1 + .../downloading/testdata/empty.txt | 0 .../hioki-daichi/downloading/testdata/foo.png | Bin 0 -> 169406 bytes 7 files changed, 636 insertions(+), 1 deletion(-) create mode 100644 kadai3-2/hioki-daichi/downloading/downloading.go create mode 100644 kadai3-2/hioki-daichi/downloading/downloading_test.go create mode 100644 kadai3-2/hioki-daichi/downloading/testdata/a.txt create mode 100644 kadai3-2/hioki-daichi/downloading/testdata/b.txt create mode 100644 kadai3-2/hioki-daichi/downloading/testdata/empty.txt create mode 100644 kadai3-2/hioki-daichi/downloading/testdata/foo.png diff --git a/kadai3-2/hioki-daichi/Gopkg.lock b/kadai3-2/hioki-daichi/Gopkg.lock index 10ef811..ba074e2 100644 --- a/kadai3-2/hioki-daichi/Gopkg.lock +++ b/kadai3-2/hioki-daichi/Gopkg.lock @@ -1,9 +1,25 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + branch = "master" + digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" + name = "golang.org/x/net" + packages = ["context"] + pruneopts = "UT" + revision = "4dfa2610cdf3b287375bbba5b8f2a14d3b01d8de" + +[[projects]] + branch = "master" + digest = "1:39ebcc2b11457b703ae9ee2e8cca0f68df21969c6102cb3b705f76cca0ea0239" + name = "golang.org/x/sync" + packages = ["errgroup"] + pruneopts = "UT" + revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca" + [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [] + input-imports = ["golang.org/x/sync/errgroup"] solver-name = "gps-cdcl" solver-version = 1 diff --git a/kadai3-2/hioki-daichi/downloading/downloading.go b/kadai3-2/hioki-daichi/downloading/downloading.go new file mode 100644 index 0000000..bc82356 --- /dev/null +++ b/kadai3-2/hioki-daichi/downloading/downloading.go @@ -0,0 +1,309 @@ +/* +Package downloading provides download function. +*/ +package downloading + +import ( + "context" + "crypto/rand" + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path" + "path/filepath" + "sync" + "time" + + "github.com/gopherdojo/dojo3/kadai3-2/hioki-daichi/opt" + "github.com/gopherdojo/dojo3/kadai3-2/hioki-daichi/termination" + "golang.org/x/sync/errgroup" +) + +var ( + errResponseDoesNotIncludeAcceptRangesHeader = errors.New("response does not include Accept-Ranges header") + errValueOfAcceptRangesHeaderIsNotBytes = errors.New("the value of Accept-Ranges header is not bytes") + errNoContent = errors.New("no content") +) + +// Downloader has the information for the download. +type Downloader struct { + outStream io.Writer + url *url.URL + parallelism int + output string + timeout time.Duration +} + +// NewDownloader generates Downloader based on Options. +func NewDownloader(w io.Writer, opts *opt.Options) *Downloader { + return &Downloader{ + outStream: w, + url: opts.URL, + parallelism: opts.Parallelism, + output: opts.Output, + timeout: opts.Timeout, + } +} + +// Download performs parallel download. +func (d *Downloader) Download(ctx context.Context) error { + ctx, cancel := context.WithTimeout(ctx, d.timeout) + defer cancel() + + contentLength, err := d.getContentLength(ctx) + if err != nil { + return err + } + + rangeHeaders := d.toRangeHeaders(contentLength) + + tempDir, err := ioutil.TempDir("", "parallel-download") + if err != nil { + return err + } + clean := func() { os.RemoveAll(tempDir) } + defer clean() + termination.CleanFunc(clean) + + filenames, err := d.parallelDownload(ctx, rangeHeaders, tempDir) + if err != nil { + return err + } + + filename, err := d.concat(filenames, tempDir) + if err != nil { + return err + } + + fmt.Fprintf(d.outStream, "rename %q to %q\n", filename, d.output) + + err = os.Rename(filename, d.output) + if err != nil { + return err + } + + fmt.Fprintf(d.outStream, "completed: %q\n", d.output) + + return nil +} + +// getContentLength returns the value of Content-Length received by making a HEAD request. +func (d *Downloader) getContentLength(ctx context.Context) (int, error) { + fmt.Fprintf(d.outStream, "start HEAD request to get Content-Length\n") + + req, err := http.NewRequest("HEAD", d.url.String(), nil) + if err != nil { + return 0, err + } + req = req.WithContext(ctx) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return 0, err + } + + err = d.validateAcceptRangesHeader(resp) + if err != nil { + return 0, err + } + + contentLength := int(resp.ContentLength) + + fmt.Fprintf(d.outStream, "got: Content-Length: %d\n", contentLength) + + if contentLength < 1 { + return 0, errNoContent + } + + return contentLength, nil +} + +// validateAcceptRangesHeader validates the following. +// - The presence of an Accept-Ranges header +// - The value of the Accept-Ranges header is "bytes" +func (d *Downloader) validateAcceptRangesHeader(resp *http.Response) error { + acceptRangesHeader := resp.Header.Get("Accept-Ranges") + + fmt.Fprintf(d.outStream, "got: Accept-Ranges: %s\n", acceptRangesHeader) + + if acceptRangesHeader == "" { + return errResponseDoesNotIncludeAcceptRangesHeader + } + + if acceptRangesHeader != "bytes" { + return errValueOfAcceptRangesHeaderIsNotBytes + } + + return nil +} + +// toRangeHeaders converts the value of Content-Length to the value of Range header. +func (d *Downloader) toRangeHeaders(contentLength int) []string { + parallelism := d.parallelism + + // 1 <= parallelism <= Content-Length + if parallelism < 1 { + parallelism = 1 + } + if contentLength < parallelism { + parallelism = contentLength + } + + unitLength := contentLength / parallelism + remainingLength := contentLength % parallelism + + rangeHeaders := make([]string, 0) + + cntr := 0 + for n := parallelism; n > 0; n-- { + min := cntr + max := cntr + unitLength - 1 + + // Add the remaining length to the last chunk + if n == 1 && remainingLength != 0 { + max += remainingLength + } + + rangeHeaders = append(rangeHeaders, fmt.Sprintf("bytes=%d-%d", min, max)) + + cntr += unitLength + } + + return rangeHeaders +} + +// parallelDownload downloads in parallel for each specified rangeHeaders and saves it in the specified dir. +func (d *Downloader) parallelDownload(ctx context.Context, rangeHeaders []string, dir string) (map[int]string, error) { + filenames := map[int]string{} + + filenameCh := make(chan map[int]string) + errCh := make(chan error) + + for i, rangeHeader := range rangeHeaders { + go d.partialDownloadAndSendToChannel(ctx, i, rangeHeader, filenameCh, errCh, dir) + } + + eg, ctx := errgroup.WithContext(ctx) + var mu sync.Mutex + for i := 0; i < len(rangeHeaders); i++ { + eg.Go(func() error { + select { + case <-ctx.Done(): + return ctx.Err() + case m := <-filenameCh: + for k, v := range m { + mu.Lock() + filenames[k] = v + mu.Unlock() + } + return nil + case err := <-errCh: + return err + } + }) + } + + if err := eg.Wait(); err != nil { + return nil, err + } + + return filenames, nil +} + +// partialDownloadAndSendToChannel performs partialDownload and sends it to the appropriate channel according to the result. +func (d *Downloader) partialDownloadAndSendToChannel(ctx context.Context, i int, rangeHeader string, filenameCh chan<- map[int]string, errCh chan<- error, dir string) { + filename, err := d.partialDownload(ctx, rangeHeader, dir) + if err != nil { + errCh <- err + return + } + + filenameCh <- map[int]string{i: filename} + + return +} + +// partialDownload sends a partial request with the specified rangeHeader, +// and saves the response body in the file under the specified dir, +// and returns the filename. +func (d *Downloader) partialDownload(ctx context.Context, rangeHeader string, dir string) (string, error) { + req, err := http.NewRequest("GET", d.url.String(), nil) + if err != nil { + return "", err + } + req = req.WithContext(ctx) + + req.Header.Set("Range", rangeHeader) + + fmt.Fprintf(d.outStream, "start GET request with header: \"Range: %s\"\n", rangeHeader) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusPartialContent { + return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fp, err := os.Create(path.Join(dir, randomHexStr())) + if err != nil { + return "", err + } + + _, err = io.Copy(fp, resp.Body) + if err != nil { + return "", err + } + + filename := fp.Name() + + fmt.Fprintf(d.outStream, "downloaded: %q\n", filename) + + return filename, nil +} + +// concat concatenates the files in order based on the mapping of the specified filenames, +// and creates the concatenated file under the specified dir, +// and returns the filename. +func (d *Downloader) concat(filenames map[int]string, dir string) (string, error) { + fp, err := os.Create(filepath.Join(dir, randomHexStr())) + if err != nil { + return "", err + } + defer fp.Close() + + filename := fp.Name() + + fmt.Fprintf(d.outStream, "concatenate downloaded files to tempfile: %q\n", filename) + + for i := 0; i < len(filenames); i++ { + src, err := os.Open(filenames[i]) + if err != nil { + return "", err + } + + _, err = io.Copy(fp, src) + if err != nil { + return "", err + } + } + + return filename, nil +} + +// randomHexStr returns a random hex string of length 10. +// 10 is a length which does not duplicate enough. +func randomHexStr() string { + b := make([]byte, 5) + _, err := rand.Read(b) + if err != nil { + panic(err) + } + return fmt.Sprintf("%x", b) +} diff --git a/kadai3-2/hioki-daichi/downloading/downloading_test.go b/kadai3-2/hioki-daichi/downloading/downloading_test.go new file mode 100644 index 0000000..8882343 --- /dev/null +++ b/kadai3-2/hioki-daichi/downloading/downloading_test.go @@ -0,0 +1,308 @@ +package downloading + +import ( + "context" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path" + "path/filepath" + "regexp" + "strconv" + "strings" + "testing" + "time" + + "github.com/gopherdojo/dojo3/kadai3-2/hioki-daichi/opt" +) + +var registeredTestdatum = map[string]string{ + "foo.png": readTestdata("foo.png"), + "a.txt": readTestdata("a.txt"), + "empty.txt": readTestdata("empty.txt"), +} + +var currentTestdataName string + +func TestDownloading_Download_Success(t *testing.T) { + cases := map[string]struct { + parallelism int + currentTestdataName string + }{ + "normal": {parallelism: 3, currentTestdataName: "foo.png"}, + "parallelism < 1": {parallelism: 0, currentTestdataName: "a.txt"}, + "contentLength < parallelism": {parallelism: 4, currentTestdataName: "a.txt"}, + } + + for n, c := range cases { + c := c + t.Run(n, func(t *testing.T) { + parallelism := c.parallelism + currentTestdataName = c.currentTestdataName + + output, clean := createTempOutput(t) + defer clean() + + ts, clean := newTestServer(t, normalHandler) + defer clean() + + err := newDownloader(t, output, ts, parallelism).Download(context.Background()) + if err != nil { + t.Fatalf("err %s", err) + } + }) + } + +} + +func TestDownloading_Download_NoContent(t *testing.T) { + expected := errNoContent + + currentTestdataName = "empty.txt" + + output, clean := createTempOutput(t) + defer clean() + + ts, clean := newTestServer(t, normalHandler) + defer clean() + + actual := newDownloader(t, output, ts, 1).Download(context.Background()) + if actual != expected { + t.Errorf(`unexpected error: expected: "%s" actual: "%s"`, expected, actual) + } +} + +func TestDownloading_Download_AcceptRangesHeaderNotFound(t *testing.T) { + expected := errResponseDoesNotIncludeAcceptRangesHeader + + output, clean := createTempOutput(t) + defer clean() + + ts, clean := newTestServer(t, func(t *testing.T, w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "") }) + defer clean() + + actual := newDownloader(t, output, ts, 8).Download(context.Background()) + if actual != expected { + t.Errorf(`unexpected error: expected: "%s" actual: "%s"`, expected, actual) + } +} + +func TestDownloading_Download_AcceptRangesHeaderSupportsBytesOnly(t *testing.T) { + expected := errValueOfAcceptRangesHeaderIsNotBytes + + output, clean := createTempOutput(t) + defer clean() + + ts, clean := newTestServer(t, func(t *testing.T, w http.ResponseWriter, r *http.Request) { + w.Header().Set("Accept-Ranges", "none") + fmt.Fprint(w, "") + }) + defer clean() + + actual := newDownloader(t, output, ts, 8).Download(context.Background()) + if actual != expected { + t.Errorf(`unexpected error: expected: "%s" actual: "%s"`, expected, actual) + } +} + +func TestDownloading_Download_BadRequest(t *testing.T) { + expected := "unexpected status code: 400" + + output, clean := createTempOutput(t) + defer clean() + + ts, clean := newTestServer(t, func(t *testing.T, w http.ResponseWriter, r *http.Request) { + w.Header().Set("Accept-Ranges", "bytes") + w.WriteHeader(http.StatusBadRequest) + fmt.Fprint(w, "bad request") + }) + defer clean() + + err := newDownloader(t, output, ts, 8).Download(context.Background()) + if err == nil { + t.Fatalf("unexpectedly err is nil") + } + actual := err.Error() + if actual != expected { + t.Errorf(`unexpected error: expected: "%s" actual: "%s"`, expected, actual) + } +} + +func TestDownloading_Download_RenameError(t *testing.T) { + currentTestdataName = "foo.png" + + ts, clean := newTestServer(t, normalHandler) + defer clean() + + err := newDownloader(t, "/non/existent/path", ts, 1).Download(context.Background()) + if err == nil { + t.Fatal("unexpectedly err is nil") + } + + if !regexp.MustCompile("/non/existent/path: no such file or directory").MatchString(err.Error()) { + t.Errorf("unexpectedly not matched: %s", err.Error()) + } +} + +func TestDownloading_getContentLength_DoError(t *testing.T) { + expected := `Head A: unsupported protocol scheme ""` + + ts, clean := newTestServer(t, noopHandler) + defer clean() + + d := newDownloader(t, "path/to/output", ts, 2) + + u, err := url.Parse("A") + if err != nil { + t.Fatalf("err %s", err) + } + + d.url = u + + _, err = d.getContentLength(context.Background()) + + actual := err.Error() + if actual != expected { + t.Errorf(`unexpected error: expected: "%s" actual: "%s"`, expected, actual) + } +} + +func TestDownloading_partialDownload_osCreateError(t *testing.T) { + ts, clean := newTestServer(t, func(t *testing.T, w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusPartialContent) + }) + defer clean() + + _, err := newDownloader(t, "", ts, 2).partialDownload(context.Background(), "bytes=0-1", "non/existent/path") + if !regexp.MustCompile("no such file or directory").MatchString(err.Error()) { + t.Errorf("unexpectedly not matched: %s", err.Error()) + } +} + +func TestDownloading_concat_osCreateError(t *testing.T) { + ts, clean := newTestServer(t, noopHandler) + defer clean() + + d := newDownloader(t, "", ts, 2) + _, err := d.concat(map[int]string{}, "non/existent/path") + + if !regexp.MustCompile("no such file or directory").MatchString(err.Error()) { + t.Errorf("unexpectedly not matched: %s", err.Error()) + } +} + +func TestDownloading_concat_osOpenError(t *testing.T) { + ts, clean := newTestServer(t, noopHandler) + defer clean() + + dir, err := ioutil.TempDir("", "parallel-download") + if err != nil { + t.Fatalf("err %s", err) + } + defer os.RemoveAll(dir) + + _, err = newDownloader(t, "", ts, 2).concat(map[int]string{0: "non/existent/path"}, dir) + + if !regexp.MustCompile("no such file or directory").MatchString(err.Error()) { + t.Errorf("unexpectedly not matched: %s", err.Error()) + } +} + +func newTestServer(t *testing.T, handler func(t *testing.T, w http.ResponseWriter, r *http.Request)) (*httptest.Server, func()) { + t.Helper() + + ts := httptest.NewServer(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + handler(t, w, r) + }, + )) + + return ts, func() { ts.Close() } +} + +func normalHandler(t *testing.T, w http.ResponseWriter, r *http.Request) { + t.Helper() + + w.Header().Set("Accept-Ranges", "bytes") + + rangeHdr := r.Header.Get("Range") + + body := func() string { + if rangeHdr == "" { + return registeredTestdatum[currentTestdataName] + } + + eqlSplitVals := strings.Split(rangeHdr, "=") + if eqlSplitVals[0] != "bytes" { + t.Fatalf("err %s", eqlSplitVals[0]) + } + + c := strings.Split(eqlSplitVals[1], "-") + + min, err := strconv.Atoi(c[0]) + if err != nil { + t.Fatalf("err %s", err) + } + + max, err := strconv.Atoi(c[1]) + if err != nil { + t.Fatalf("err %s", err) + } + + return registeredTestdatum[currentTestdataName][min : max+1] + }() + + w.Header().Set("Content-Length", fmt.Sprintf("%d", len(body))) + + w.WriteHeader(http.StatusPartialContent) + + fmt.Fprint(w, body) +} + +func noopHandler(t *testing.T, w http.ResponseWriter, r *http.Request) {} + +func newDownloader(t *testing.T, output string, ts *httptest.Server, parallelism int) *Downloader { + t.Helper() + + opts := &opt.Options{ + Parallelism: parallelism, + Output: output, + URL: mustParseRequestURI(t, ts.URL), + Timeout: 60 * time.Second, + } + + return NewDownloader(ioutil.Discard, opts) +} + +func mustParseRequestURI(t *testing.T, s string) *url.URL { + t.Helper() + + u, err := url.ParseRequestURI(s) + if err != nil { + t.Fatalf("err %s", err) + } + + return u +} + +func readTestdata(filename string) string { + b, err := ioutil.ReadFile(path.Join("testdata", filename)) + if err != nil { + panic(err) + } + return string(b) +} + +func createTempOutput(t *testing.T) (string, func()) { + t.Helper() + + dir, err := ioutil.TempDir("", "parallel-download") + if err != nil { + panic(err) + } + + return filepath.Join(dir, "output.txt"), func() { os.RemoveAll(dir) } +} diff --git a/kadai3-2/hioki-daichi/downloading/testdata/a.txt b/kadai3-2/hioki-daichi/downloading/testdata/a.txt new file mode 100644 index 0000000..7898192 --- /dev/null +++ b/kadai3-2/hioki-daichi/downloading/testdata/a.txt @@ -0,0 +1 @@ +a diff --git a/kadai3-2/hioki-daichi/downloading/testdata/b.txt b/kadai3-2/hioki-daichi/downloading/testdata/b.txt new file mode 100644 index 0000000..6178079 --- /dev/null +++ b/kadai3-2/hioki-daichi/downloading/testdata/b.txt @@ -0,0 +1 @@ +b diff --git a/kadai3-2/hioki-daichi/downloading/testdata/empty.txt b/kadai3-2/hioki-daichi/downloading/testdata/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/kadai3-2/hioki-daichi/downloading/testdata/foo.png b/kadai3-2/hioki-daichi/downloading/testdata/foo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f8d01ff6a06b1beaeb11ad50d472f56dff7cd6 GIT binary patch literal 169406 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∓a^vW;4g`$M(l&$wk~iAo zCHa4MEGndt26!!NCpBZis|T-LX#z0G7^)UFDZme18D@Q|hbcH4&{@tihwx!sfGQ_U zq=}Z;_FH^A1B*Wu6~F>}Z?uo;U^Q-MpB|WSrG?=@5-pLe2kM_GKeq#U$c)BUb8Ra{ zDrY|J6WQ}L`Hh)K929XJ1DTNLg_HaT`hvk zf`w#Z9gotD0?|Mf--(L2<*kxDEnVKsMFU+IOrgq%!IUh2KIB?^{jt>LOn(@`2~XkI zR9SwuzS?!W+E|ljTC)+z@fSZ~*iD4)UL!L{PJfX9kg#;=bQPEjN2R&9+L8+vV>Mg< z@Ekeyh%o1A12nW5fjFeM5&J%EOBQSxB==7|e*Ad)Jv?7ynFt`BO_4MJkhl|Ktb2qB( zSuIk!2~Fa%jzA&Gu8Qz92Z~-!dmS-nLiD*jM>XSxYmse`CuCPv zwuLX?z=%ovo)rwvyq!4*Kar}4l3Qdc0I?g+nxC*+{<|SC6IA3-Y{wS@{aaq{I-=#? zymtF1oS+)>E}BfRaiK+o;QJ^ED7-L6F--L(NX(%FvUH6<+c2<001JryvUN9n(V;YL zY7}0jD~xBc&o8BjOPFqvSM`pSsZ)PmAiCzM>@^wU$E=UX<4@-Xfm!6|!P=PfNXpoj z$T%wQI^CPak@`||J{}LF2@DlYf-QDD1jfiNv&l1hDJByLRLt0a?|PniD{$YhRA10r z!x=4D-|ba+Eb+^Vnqj0kRr3585)Ud{iZr2SEL`7vkwpIicF3;t58%qe3(uqq0O0O! zsZl!)OSX}Y!s)whQh801sgMIbEK9W98Gp`xz?OjJfR_IuN0A?snp`0lJlT0Pgd~^x zk0l`c51BGV!zD2#`?kWzAHZQfx4$>#0mQf6O`UOD&5ByjTy9KTH}@x-*_zdYt;B9d z_yvY+MxR64A!H3i9Q3^O>XAG~WtR-xm>C>=yJ;)r3QsDF#`*ClJAN&$!RuvFyg(4OJ9x}oXM(HGabPWT{-E;d=km&@-^o~O?bKpejV@@(fLub|{J5#tc z2I*M_{v{fojyT3?2~!{pN)#lg<<6s{uixf9@;2D*x@1x$oZOn!Sfw27AtS z0>kcRaJwWy4Z#c*yE7VTq8QK6BN7WWtdgzq^bmLpanr;lHrh8L4qGF#ug8q|-k|

#D1M!Qw6(XgPaGMLK^lP%dAk`XfWm% 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 z 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 PZ;KZ!v$;BdL+Jkjyk5Kp literal 0 HcmV?d00001 From de28ab19c5dfa5273068f209d8d5187a8a2bc2c4 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:21:21 +0900 Subject: [PATCH 09/12] Add main.go --- kadai3-2/hioki-daichi/main.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 kadai3-2/hioki-daichi/main.go diff --git a/kadai3-2/hioki-daichi/main.go b/kadai3-2/hioki-daichi/main.go new file mode 100644 index 0000000..25e13a5 --- /dev/null +++ b/kadai3-2/hioki-daichi/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "context" + "io" + "log" + "os" + + "github.com/gopherdojo/dojo3/kadai3-2/hioki-daichi/downloading" + "github.com/gopherdojo/dojo3/kadai3-2/hioki-daichi/opt" + "github.com/gopherdojo/dojo3/kadai3-2/hioki-daichi/termination" +) + +func main() { + err := execute(os.Stdout, os.Args[1:]) + if err != nil { + log.Fatal(err) + } +} + +func execute(w io.Writer, args []string) error { + ctx := context.Background() + + ctx, clean := termination.Listen(ctx, w) + defer clean() + + opts, err := opt.Parse(args...) + if err != nil { + return err + } + + return downloading.NewDownloader(w, opts).Download(ctx) +} From e475ffb060e17a46d9494641944b02102ffe0763 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:22:49 +0900 Subject: [PATCH 10/12] Add ./bin/dummy_server.go --- kadai3-2/hioki-daichi/bin/dummy_server.go | 93 +++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100755 kadai3-2/hioki-daichi/bin/dummy_server.go diff --git a/kadai3-2/hioki-daichi/bin/dummy_server.go b/kadai3-2/hioki-daichi/bin/dummy_server.go new file mode 100755 index 0000000..fa1350f --- /dev/null +++ b/kadai3-2/hioki-daichi/bin/dummy_server.go @@ -0,0 +1,93 @@ +//usr/bin/env go run $0 $@ ; exit + +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "log" + "math/rand" + "net/http" + "os" + "strconv" + "strings" + "time" +) + +func main() { + rand.Seed(time.Now().UnixNano()) + + flg := flag.NewFlagSet("test", flag.ExitOnError) + + port := flg.Int("port", 8080, "Port on which the dummy server listens.") + failureRate := flg.Int("failure-rate", 0, "Probability to return InternalServerError.") + maxDelay := flg.Duration("max-delay", time.Second, "Maximum time delay randomly applied from receiving a request until returning a response.") + + flg.Parse(os.Args[1:]) + + fmt.Print(`-------------------------------------------------------------------------------- +# Endpoint + + GET /foo.png // Get a gopher image + +# Command-line options** + +`) + flg.PrintDefaults() + fmt.Println("--------------------------------------------------------------------------------") + + contents := func() string { + b, err := ioutil.ReadFile("./downloading/testdata/foo.png") + if err != nil { + panic(err) + } + return string(b) + }() + + handler := func(w http.ResponseWriter, req *http.Request) { + if req.Method != "HEAD" { + time.Sleep(time.Duration(rand.Intn(int(*maxDelay)))) + } + + w.Header().Set("Accept-Ranges", "bytes") + + var body string + var statusCode int + if req.Method == "GET" && rand.Intn(100) < *failureRate { + body = "Internal Server Error" + statusCode = http.StatusInternalServerError + } else { + body = func(req *http.Request) string { + rangeHeader := req.Header.Get("Range") // e.g. "bytes=0-99" + if rangeHeader == "" { + return contents + } + c := strings.Split(strings.Split(rangeHeader, "=")[1], "-") + min, _ := strconv.Atoi(c[0]) + max, _ := strconv.Atoi(c[1]) + return contents[min : max+1] + }(req) + statusCode = http.StatusPartialContent + } + + w.Header().Set("Content-Length", fmt.Sprintf("%d", len(body))) + w.WriteHeader(statusCode) + fmt.Fprint(w, body) + + log.Printf("%s %s %d %s\n", req.Method, req.RequestURI, statusCode, req.Header.Get("Range")) + } + + http.HandleFunc("/foo.png", handler) + + if *failureRate > 0 { + log.Printf("Server starting with a failure rate of %d%% on http://localhost:%d\n", *failureRate, *port) + } else { + log.Printf("Server starting on http://localhost:%d\n", *port) + } + + err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil) + if err != nil { + log.Fatal(err) + } +} From 0c3cbef32a4da8305993456018812d47bb3eee1e Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:27:50 +0900 Subject: [PATCH 11/12] Add README.md --- kadai3-2/hioki-daichi/README.md | 79 +++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/kadai3-2/hioki-daichi/README.md b/kadai3-2/hioki-daichi/README.md index 3d8c456..131937a 100644 --- a/kadai3-2/hioki-daichi/README.md +++ b/kadai3-2/hioki-daichi/README.md @@ -1 +1,80 @@ # parallel-download + +## Overview + +`parallel-download` is a command that can download the resources on the web in parallel. + +Available options are below. + +| Option | Description | +| --- | --- | +| `-p` | Download files in parallel according to the specified number. (default 8) | +| `-o` | Save the downloaded file in the specified path. (Overwrite if duplicates.) | +| `-t` | Terminate when the specified value has elapsed since download started. (default 30s) | + +## How to develop + +### 1. Install packages + +Execute `$ dep ensure` to install dependent packages. + +### 2. Start a dummy server + +Execute `$ ./bin/dummy_server.go` to start a dummy server that returns a Gopher image. + +``` +$ ./bin/dummy_server.go +-------------------------------------------------------------------------------- +# Endpoint + + GET /foo.png // Get a gopher image + +# Command-line options** + + -failure-rate int + Probability to return InternalServerError. + -max-delay duration + Maximum time delay randomly applied from receiving a request until returning a response. (default 1s) + -port int + Port on which the dummy server listens. (default 8080) +-------------------------------------------------------------------------------- +2018/09/30 00:25:05 Server starting on http://localhost:8080 +``` + +### 3. Execute + +Execute the command with specifying the Gopher image endpoint of the dummy server (and some options). + +``` +$ go run main.go -p=3 -t=3s -o=bar.png http://localhost:8080/foo.png +start HEAD request to get Content-Length +got: Accept-Ranges: bytes +got: Content-Length: 169406 +start GET request with header: "Range: bytes=112936-169405" +start GET request with header: "Range: bytes=56468-112935" +start GET request with header: "Range: bytes=0-56467" +downloaded: "/var/folders/f8/1n0bk4tj4ll6clyj868k_nqh0000gn/T/parallel-download301219462/f4ec179a35" +downloaded: "/var/folders/f8/1n0bk4tj4ll6clyj868k_nqh0000gn/T/parallel-download301219462/f8d59617fb" +downloaded: "/var/folders/f8/1n0bk4tj4ll6clyj868k_nqh0000gn/T/parallel-download301219462/9e9b203414" +concatenate downloaded files to tempfile: "/var/folders/f8/1n0bk4tj4ll6clyj868k_nqh0000gn/T/parallel-download301219462/814ff17dbf" +rename "/var/folders/f8/1n0bk4tj4ll6clyj868k_nqh0000gn/T/parallel-download301219462/814ff17dbf" to "bar.png" +completed: "bar.png" +``` + +## How to run the test + +```shell +$ make test +``` + +## How to read GoDoc + +```shell +$ make doc +``` + +## How to see code coverage + +```shell +$ make cov +``` From dbb3b82d819c63ce837cf0ca1e6261d2bfccbe29 Mon Sep 17 00:00:00 2001 From: Daichi Hioki Date: Sun, 30 Sep 2018 00:29:05 +0900 Subject: [PATCH 12/12] Add coverage.html --- kadai3-2/hioki-daichi/coverage.html | 526 ++++++++++++++++++++++++++++ 1 file changed, 526 insertions(+) create mode 100644 kadai3-2/hioki-daichi/coverage.html diff --git a/kadai3-2/hioki-daichi/coverage.html b/kadai3-2/hioki-daichi/coverage.html new file mode 100644 index 0000000..1e7f8a2 --- /dev/null +++ b/kadai3-2/hioki-daichi/coverage.html @@ -0,0 +1,526 @@ + + + + + + + + +

+ +
+ not tracked + + no coverage + low coverage + * + * + * + * + * + * + * + * + high coverage + +
+
+
+ + + + + + + +
+ + +