diff options
| author | r <r@freesoftwareextremist.com> | 2020-10-30 17:07:06 +0000 | 
|---|---|---|
| committer | r <r@freesoftwareextremist.com> | 2020-10-30 17:07:06 +0000 | 
| commit | 140dfe2f638e755fa137995a29f2f44aa0b8c310 (patch) | |
| tree | 1fe05a7c767451dee658521a9d4ac5329025f4ab | |
| parent | 237182c171beafc2d823fa6ea319bdd7e7209190 (diff) | |
| download | bloat-140dfe2f638e755fa137995a29f2f44aa0b8c310.tar.gz bloat-140dfe2f638e755fa137995a29f2f44aa0b8c310.zip | |
Fix http client
- Remove automatic retries on 429
- Tweak http client config for better connection re-using
| -rw-r--r-- | main.go | 18 | ||||
| -rw-r--r-- | mastodon/mastodon.go | 34 | 
2 files changed, 24 insertions, 28 deletions
| @@ -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,  	}  } | 
