Fix http client

- Remove automatic retries on 429
- Tweak http client config for better connection re-using
This commit is contained in:
r 2020-10-30 17:07:06 +00:00
parent 237182c171
commit 140dfe2f63
2 changed files with 24 additions and 28 deletions

18
main.go
View file

@ -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)

View 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,
}
}