From d436d88ac7ac735073aaf0699c1217af15122f0d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 17 Aug 2024 16:47:16 -0600 Subject: [PATCH] use report API --- cluster/requests.go | 4 ++-- cluster/storage.go | 23 ++++++++++++++++++----- internal/build/version.go | 2 +- utils/http.go | 6 ++++++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/cluster/requests.go b/cluster/requests.go index 51209b0..8ba8157 100644 --- a/cluster/requests.go +++ b/cluster/requests.go @@ -260,13 +260,13 @@ func (cr *Cluster) RequestCert(ctx context.Context) (ckp *CertKeyPair, err error return } -func (cr *Cluster) ReportDownload(ctx context.Context, request *http.Request, err error) error { +func (cr *Cluster) ReportDownload(ctx context.Context, response *http.Response, err error) error { type ReportPayload struct { Urls []string `json:"urls"` Error utils.EmbedJSON[struct{ Message string }] `json:"error"` } var payload ReportPayload - redirects := utils.GetRedirects(request) + redirects := utils.GetRedirects(response.Request) payload.Urls = make([]string, len(redirects)) for i, u := range redirects { payload.Urls[i] = u.String() diff --git a/cluster/storage.go b/cluster/storage.go index 1f1d769..04c9cd8 100644 --- a/cluster/storage.go +++ b/cluster/storage.go @@ -75,7 +75,8 @@ type FileInfo struct { type RequestPath struct { *http.Request - Path string + Cluster *Cluster + Path string } type StorageFileInfo struct { @@ -153,7 +154,11 @@ func (cr *Cluster) GetFileList(ctx context.Context, fileMap map[string]*StorageF if err != nil { return err } - ff.URLs[req.URL.String()] = RequestPath{Request: req, Path: f.Path} + ff.URLs[req.URL.String()] = RequestPath{ + Request: req, + Cluster: cr, + Path: f.Path, + } fileMap[f.Hash] = ff } } @@ -548,9 +553,9 @@ func (c *HTTPClient) fetchFile(ctx context.Context, stats *syncStats, f *Storage } reqInd := 0 - reqs := make([]*http.Request, 0, len(f.URLs)) + reqs := make([]RequestPath, 0, len(f.URLs)) for _, rq := range f.URLs { - reqs = append(reqs, rq.Request) + reqs = append(reqs, rq) } fileRes := make(chan *os.File, 1) @@ -610,10 +615,18 @@ func (c *HTTPClient) fetchFile(ctx context.Context, stats *syncStats, f *Storage if _, err := fd.Seek(io.SeekStart, 0); err != nil { return err } - if err := c.fetchFileWithBuf(ctx, reqs[reqInd], f.Size, hashMethod, f.Hash, fd, buf, func(r io.Reader) io.Reader { + rp := reqs[reqInd] + if err := c.fetchFileWithBuf(ctx, rp.Request, f.Size, hashMethod, f.Hash, fd, buf, func(r io.Reader) io.Reader { return utils.ProxyPBReader(r, bar, stats.totalBar, &stats.lastInc) }); err != nil { reqInd = (reqInd + 1) % len(reqs) + if rerr, ok := err.(*utils.RedirectError); ok { + go func() { + if err := rp.Cluster.ReportDownload(context.WithoutCancel(ctx), rerr.GetResponse(), rerr.Unwrap()); err != nil { + log.Warnf("Report API error: %v", err) + } + }() + } return err } return nil diff --git a/internal/build/version.go b/internal/build/version.go index 2b8613a..d0d0685 100644 --- a/internal/build/version.go +++ b/internal/build/version.go @@ -23,7 +23,7 @@ import ( "fmt" ) -const ClusterVersion = "1.10.9" +const ClusterVersion = "1.11.0" var BuildVersion string = "dev" diff --git a/utils/http.go b/utils/http.go index 600d186..cd5b386 100644 --- a/utils/http.go +++ b/utils/http.go @@ -525,12 +525,14 @@ func GetRedirects(req *http.Request) []*url.URL { type RedirectError struct { Redirects []*url.URL + Response *http.Response Err error } func ErrorFromRedirect(err error, resp *http.Response) *RedirectError { return &RedirectError{ Redirects: GetRedirects(resp.Request), + Response: resp, Err: err, } } @@ -551,6 +553,10 @@ func (e *RedirectError) Error() string { return b.String() } +func (e *RedirectError) GetResponse() *http.Response { + return e.Response +} + func (e *RedirectError) Unwrap() error { return e.Err }