diff --git a/internal/backend/rclone/backend.go b/internal/backend/rclone/backend.go index f4e2770a1..97ed417a3 100644 --- a/internal/backend/rclone/backend.go +++ b/internal/backend/rclone/backend.go @@ -22,7 +22,6 @@ import ( "github.com/restic/restic/internal/backend/rest" "github.com/restic/restic/internal/debug" "github.com/restic/restic/internal/errors" - "golang.org/x/net/context/ctxhttp" "golang.org/x/net/http2" ) @@ -216,7 +215,7 @@ func newBackend(cfg Config, lim limiter.Limiter) (*Backend, error) { }() // send an HTTP request to the base URL, see if the server is there - client := &http.Client{ + client := http.Client{ Transport: debug.RoundTripper(tr), Timeout: cfg.Timeout, } @@ -231,7 +230,7 @@ func newBackend(cfg Config, lim limiter.Limiter) (*Backend, error) { } req.Header.Set("Accept", rest.ContentTypeV2) - res, err := ctxhttp.Do(ctx, client, req) + res, err := client.Do(req) if err != nil { // ignore subsequent errors _ = bg() @@ -240,7 +239,7 @@ func newBackend(cfg Config, lim limiter.Limiter) (*Backend, error) { // wait for rclone to exit wg.Wait() // try to return the program exit code if communication with rclone has failed - if be.waitResult != nil && (err == context.Canceled || errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, syscall.EPIPE)) { + if be.waitResult != nil && (errors.Is(err, context.Canceled) || errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, syscall.EPIPE)) { err = be.waitResult } diff --git a/internal/backend/rest/rest.go b/internal/backend/rest/rest.go index cd41bc0ce..6444e8655 100644 --- a/internal/backend/rest/rest.go +++ b/internal/backend/rest/rest.go @@ -14,8 +14,6 @@ import ( "strconv" "strings" - "golang.org/x/net/context/ctxhttp" - "github.com/restic/restic/internal/backend" "github.com/restic/restic/internal/backend/sema" "github.com/restic/restic/internal/debug" @@ -33,7 +31,7 @@ type Backend struct { url *url.URL connections uint sem sema.Semaphore - client *http.Client + client http.Client backend.Layout } @@ -45,8 +43,6 @@ const ( // Open opens the REST backend with the given config. func Open(cfg Config, rt http.RoundTripper) (*Backend, error) { - client := &http.Client{Transport: rt} - sem, err := sema.New(cfg.Connections) if err != nil { return nil, err @@ -60,7 +56,7 @@ func Open(cfg Config, rt http.RoundTripper) (*Backend, error) { be := &Backend{ url: cfg.URL, - client: client, + client: http.Client{Transport: rt}, Layout: &backend.RESTLayout{URL: url, Join: path.Join}, connections: cfg.Connections, sem: sem, @@ -138,9 +134,10 @@ func (b *Backend) Save(ctx context.Context, h restic.Handle, rd restic.RewindRea defer cancel() // make sure that client.Post() cannot close the reader by wrapping it - req, err := http.NewRequest(http.MethodPost, b.Filename(h), ioutil.NopCloser(rd)) + req, err := http.NewRequestWithContext(ctx, + http.MethodPost, b.Filename(h), ioutil.NopCloser(rd)) if err != nil { - return errors.Wrap(err, "NewRequest") + return errors.WithStack(err) } req.Header.Set("Content-Type", "application/octet-stream") req.Header.Set("Accept", ContentTypeV2) @@ -150,7 +147,7 @@ func (b *Backend) Save(ctx context.Context, h restic.Handle, rd restic.RewindRea req.ContentLength = rd.Length() b.sem.GetToken() - resp, err := ctxhttp.Do(ctx, b.client, req) + resp, err := b.client.Do(req) b.sem.ReleaseToken() var cerr error @@ -160,7 +157,7 @@ func (b *Backend) Save(ctx context.Context, h restic.Handle, rd restic.RewindRea } if err != nil { - return errors.Wrap(err, "client.Post") + return errors.WithStack(err) } if resp.StatusCode != 200 { @@ -269,9 +266,9 @@ func (b *Backend) openReader(ctx context.Context, h restic.Handle, length int, o return nil, errors.Errorf("invalid length %d", length) } - req, err := http.NewRequest("GET", b.Filename(h), nil) + req, err := http.NewRequestWithContext(ctx, "GET", b.Filename(h), nil) if err != nil { - return nil, errors.Wrap(err, "http.NewRequest") + return nil, errors.WithStack(err) } byteRange := fmt.Sprintf("bytes=%d-", offset) @@ -283,7 +280,7 @@ func (b *Backend) openReader(ctx context.Context, h restic.Handle, length int, o debug.Log("Load(%v) send range %v", h, byteRange) b.sem.GetToken() - resp, err := ctxhttp.Do(ctx, b.client, req) + resp, err := b.client.Do(req) b.sem.ReleaseToken() if err != nil { @@ -321,17 +318,17 @@ func (b *Backend) Stat(ctx context.Context, h restic.Handle) (restic.FileInfo, e return restic.FileInfo{}, backoff.Permanent(err) } - req, err := http.NewRequest(http.MethodHead, b.Filename(h), nil) + req, err := http.NewRequestWithContext(ctx, http.MethodHead, b.Filename(h), nil) if err != nil { - return restic.FileInfo{}, errors.Wrap(err, "NewRequest") + return restic.FileInfo{}, errors.WithStack(err) } req.Header.Set("Accept", ContentTypeV2) b.sem.GetToken() - resp, err := ctxhttp.Do(ctx, b.client, req) + resp, err := b.client.Do(req) b.sem.ReleaseToken() if err != nil { - return restic.FileInfo{}, errors.Wrap(err, "client.Head") + return restic.FileInfo{}, errors.WithStack(err) } _, _ = io.Copy(ioutil.Discard, resp.Body) @@ -376,14 +373,14 @@ func (b *Backend) Remove(ctx context.Context, h restic.Handle) error { return backoff.Permanent(err) } - req, err := http.NewRequest("DELETE", b.Filename(h), nil) + req, err := http.NewRequestWithContext(ctx, "DELETE", b.Filename(h), nil) if err != nil { - return errors.Wrap(err, "http.NewRequest") + return errors.WithStack(err) } req.Header.Set("Accept", ContentTypeV2) b.sem.GetToken() - resp, err := ctxhttp.Do(ctx, b.client, req) + resp, err := b.client.Do(req) b.sem.ReleaseToken() if err != nil { @@ -415,14 +412,14 @@ func (b *Backend) List(ctx context.Context, t restic.FileType, fn func(restic.Fi url += "/" } - req, err := http.NewRequest(http.MethodGet, url, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { - return errors.Wrap(err, "NewRequest") + return errors.WithStack(err) } req.Header.Set("Accept", ContentTypeV2) b.sem.GetToken() - resp, err := ctxhttp.Do(ctx, b.client, req) + resp, err := b.client.Do(req) b.sem.ReleaseToken() if err != nil { diff --git a/internal/selfupdate/github.go b/internal/selfupdate/github.go index 637f6765e..c5cc77286 100644 --- a/internal/selfupdate/github.go +++ b/internal/selfupdate/github.go @@ -10,7 +10,6 @@ import ( "time" "github.com/pkg/errors" - "golang.org/x/net/context/ctxhttp" ) // Release collects data about a single release on GitHub. @@ -53,7 +52,7 @@ func GitHubLatestRelease(ctx context.Context, owner, repo string) (Release, erro defer cancel() url := fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/latest", owner, repo) - req, err := http.NewRequest(http.MethodGet, url, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { return Release{}, err } @@ -61,7 +60,7 @@ func GitHubLatestRelease(ctx context.Context, owner, repo string) (Release, erro // pin API version 3 req.Header.Set("Accept", "application/vnd.github.v3+json") - res, err := ctxhttp.Do(ctx, http.DefaultClient, req) + res, err := http.DefaultClient.Do(req) if err != nil { return Release{}, err } @@ -112,7 +111,7 @@ func GitHubLatestRelease(ctx context.Context, owner, repo string) (Release, erro } func getGithubData(ctx context.Context, url string) ([]byte, error) { - req, err := http.NewRequest(http.MethodGet, url, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { return nil, err } @@ -120,7 +119,7 @@ func getGithubData(ctx context.Context, url string) ([]byte, error) { // request binary data req.Header.Set("Accept", "application/octet-stream") - res, err := ctxhttp.Do(ctx, http.DefaultClient, req) + res, err := http.DefaultClient.Do(req) if err != nil { return nil, err }