From 77dfb4949636aa6d890732da6ed6dc2e9532fa32 Mon Sep 17 00:00:00 2001 From: Spiegel Date: Sat, 9 May 2026 20:10:33 +0900 Subject: [PATCH] fix: harden request error handling --- client.go | 34 +++++++++++++++++++++++++++++----- dependency.png | Bin 16304 -> 16441 bytes fetch_test.go | 39 +++++++++++++++++++++++++++++++++++++++ go.sum | 2 -- response.go | 2 +- 5 files changed, 69 insertions(+), 8 deletions(-) diff --git a/client.go b/client.go index b9857d7..21eb1e2 100644 --- a/client.go +++ b/client.go @@ -2,6 +2,7 @@ package fetch import ( "context" + "errors" "fmt" "io" "net/http" @@ -30,6 +31,10 @@ func New(opts ...ClientOpts) Client { // WithProtocol returns function for setting http.Client. func WithHTTPClient(cli *http.Client) ClientOpts { return func(c *client) { + if cli == nil { + c.client = &http.Client{} + return + } c.client = cli } } @@ -44,11 +49,14 @@ func (c *client) Get(u *url.URL, opts ...RequestOpts) (Response, error) { func (c *client) GetWithContext(ctx context.Context, u *url.URL, opts ...RequestOpts) (Response, error) { req, err := request(ctx, http.MethodGet, u, nil, opts...) if err != nil { - return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", u.String())) + if errors.Is(err, ErrInvalidURL) { + return nil, errs.Wrap(ErrInvalidURL, errs.WithCause(err), errs.WithContext("url", urlText(u))) + } + return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", urlText(u))) } resp, err := c.fetch(req) if err != nil { - return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", u.String())) + return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", urlText(u))) } return resp, nil } @@ -63,11 +71,14 @@ func (c *client) Post(u *url.URL, payload io.Reader, opts ...RequestOpts) (Respo func (c *client) PostWithContext(ctx context.Context, u *url.URL, payload io.Reader, opts ...RequestOpts) (Response, error) { req, err := request(ctx, http.MethodPost, u, payload, opts...) if err != nil { - return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", u.String())) + if errors.Is(err, ErrInvalidURL) { + return nil, errs.Wrap(ErrInvalidURL, errs.WithCause(err), errs.WithContext("url", urlText(u))) + } + return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", urlText(u))) } resp, err := c.fetch(req) if err != nil { - return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", u.String())) + return nil, errs.Wrap(ErrInvalidRequest, errs.WithCause(err), errs.WithContext("url", urlText(u))) } return resp, nil } @@ -100,6 +111,9 @@ func WithRequestHeaderSet(name, value string) RequestOpts { } func request(ctx context.Context, method string, u *url.URL, payload io.Reader, opts ...RequestOpts) (*http.Request, error) { + if u == nil { + return nil, errs.Wrap(ErrInvalidURL) + } req, err := http.NewRequestWithContext(ctx, method, u.String(), payload) if err != nil { return nil, errs.Wrap(err) @@ -114,6 +128,9 @@ func (c *client) fetch(request *http.Request) (Response, error) { if c == nil { c = New().(*client) } + if c.client == nil { + c.client = &http.Client{} + } r, err := c.client.Do(request) if err != nil { return nil, errs.Wrap(err) @@ -121,7 +138,7 @@ func (c *client) fetch(request *http.Request) (Response, error) { resp := &response{r} if resp.StatusCode == 0 || resp.StatusCode >= http.StatusBadRequest { err := ErrHTTPStatus - if cerr := resp.Close(); cerr != nil && !errs.Is(err, os.ErrClosed) { + if cerr := resp.Close(); cerr != nil && !errs.Is(cerr, os.ErrClosed) { err = errs.Join(cerr, err) } return nil, errs.Wrap(fmt.Errorf("%w: status %d", err, resp.StatusCode), errs.WithContext("status", resp.StatusCode)) @@ -129,6 +146,13 @@ func (c *client) fetch(request *http.Request) (Response, error) { return resp, nil } +func urlText(u *url.URL) string { + if u == nil { + return "" + } + return u.String() +} + /* Copyright 2021-2025 Spiegel * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/dependency.png b/dependency.png index a7f564c57a759dc18f192ee883fa52163d15741b..2f4474572a3aa90c119467fbf9eb2409bb5acd55 100644 GIT binary patch literal 16441 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 literal 16304 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