MCPcopy
hub / github.com/yuk7/wsldl / DownloadFile

Function DownloadFile

src/lib/download/download.go:23–117  ·  view source on GitHub ↗
(ctx context.Context, url, dest string, progressBarWidth int)

Source from the content-addressed store, hash-verified

21)
22
23func DownloadFile(ctx context.Context, url, dest string, progressBarWidth int) (string, error) {
24 if ctx == nil {
25 ctx = context.Background()
26 }
27
28 resumeOffset := int64(0)
29 info, err := downloadStatFile(dest)
30 if err == nil {
31 resumeOffset = info.Size()
32 } else if !errors.Is(err, os.ErrNotExist) {
33 return "", err
34 }
35
36 req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
37 if err != nil {
38 return "", err
39 }
40 if resumeOffset > 0 {
41 req.Header.Set("Range", fmt.Sprintf("bytes=%d-", resumeOffset))
42 }
43 resp, err := http.DefaultClient.Do(req)
44 if err != nil {
45 return "", err
46 }
47 defer resp.Body.Close()
48
49 if resp.StatusCode == http.StatusRequestedRangeNotSatisfiable && resumeOffset > 0 {
50 return downloadCalcSHA256(dest)
51 }
52 if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices {
53 return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode)
54 }
55
56 appendMode := resumeOffset > 0 && resp.StatusCode == http.StatusPartialContent
57 if !appendMode {
58 resumeOffset = 0
59 }
60
61 openFlags := os.O_CREATE | os.O_WRONLY | os.O_TRUNC
62 if appendMode {
63 openFlags = os.O_CREATE | os.O_WRONLY | os.O_APPEND
64 }
65
66 f, err := os.OpenFile(dest, openFlags, 0644)
67 if err != nil {
68 return "", err
69 }
70 defer f.Close()
71
72 size := resp.ContentLength
73 if appendMode && size > 0 {
74 size += resumeOffset
75 }
76
77 if size == 0 {
78 if progressBarWidth > 0 {
79 errutil.ErrorRedPrintln("Failed to get total file size")
80 }

Calls 1

CloseMethod · 0.45