Fix http client
authorr <r@freesoftwareextremist.com>
Fri, 30 Oct 2020 17:07:06 +0000 (17:07 +0000)
committerr <r@freesoftwareextremist.com>
Fri, 30 Oct 2020 17:07:06 +0000 (17:07 +0000)
- Remove automatic retries on 429
- Tweak http client config for better connection re-using

main.go
mastodon/mastodon.go

diff --git a/main.go b/main.go
index 87be0d21b610730507f1aef014270f7540eeb3c4..80baa8181be0f81060d12ac58a631633b6456ac0 100644 (file)
--- 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)
index 74fa0ff5ef77266cbc34cc319077cd85c73b9329..658b09bf40e290ec87d8c72f357f3fdea91e1d2e 100644 (file)
@@ -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,
        }
 }