From 140dfe2f638e755fa137995a29f2f44aa0b8c310 Mon Sep 17 00:00:00 2001 From: r Date: Fri, 30 Oct 2020 17:07:06 +0000 Subject: [PATCH] Fix http client - Remove automatic retries on 429 - Tweak http client config for better connection re-using --- main.go | 18 ++++++++++++++++++ mastodon/mastodon.go | 34 ++++++---------------------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/main.go b/main.go index 87be0d2..80baa81 100644 --- a/main.go +++ b/main.go @@ -4,10 +4,12 @@ import ( "errors" "fmt" "log" + "net" "net/http" "os" "path/filepath" "strings" + "time" "bloat/config" "bloat/kv" @@ -26,6 +28,20 @@ func errExit(err error) { os.Exit(1) } +func setupHttp() { + tr := http.DefaultTransport.(*http.Transport) + tr.MaxIdleConnsPerHost = 30 + tr.MaxIdleConns = 300 + tr.ForceAttemptHTTP2 = false + tr.DialContext = (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 3 * time.Minute, + DualStack: true, + }).DialContext + client := http.DefaultClient + client.Transport = tr +} + func main() { opts, _, err := util.Getopts(os.Args, "f:") if err != nil { @@ -93,6 +109,8 @@ func main() { logger = log.New(lf, "", log.LstdFlags) } + setupHttp() + s := service.NewService(config.ClientName, config.ClientScope, config.ClientWebsite, customCSS, config.PostFormats, renderer, sessionRepo, appRepo, config.SingleInstance) diff --git a/mastodon/mastodon.go b/mastodon/mastodon.go index 74fa0ff..658b09b 100644 --- a/mastodon/mastodon.go +++ b/mastodon/mastodon.go @@ -15,7 +15,6 @@ import ( "path" "path/filepath" "strings" - "time" "github.com/tomnomnom/linkheader" ) @@ -30,7 +29,7 @@ type Config struct { // Client is a API client for mastodon. type Client struct { - http.Client + *http.Client config *Config } @@ -144,32 +143,11 @@ func (c *Client) doAPI(ctx context.Context, method string, uri string, params in req.Header.Set("Content-Type", ct) } - var resp *http.Response - backoff := 1000 * time.Millisecond - for { - resp, err = c.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - // handle status code 429, which indicates the server is throttling - // our requests. Do an exponential backoff and retry the request. - if resp.StatusCode == 429 { - if backoff > time.Hour { - break - } - backoff *= 2 - - select { - case <-time.After(backoff): - case <-ctx.Done(): - return ctx.Err() - } - continue - } - break + resp, err := c.Do(req) + if err != nil { + return err } + defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return parseAPIError("bad request", resp) @@ -190,7 +168,7 @@ func (c *Client) doAPI(ctx context.Context, method string, uri string, params in // NewClient return new mastodon API client. func NewClient(config *Config) *Client { return &Client{ - Client: *http.DefaultClient, + Client: http.DefaultClient, config: config, } }