mirror of
https://git.freesoftwareextremist.com/bloat
synced 2024-12-22 09:10:42 +00:00
Fix http client
- Remove automatic retries on 429 - Tweak http client config for better connection re-using
This commit is contained in:
parent
237182c171
commit
140dfe2f63
2 changed files with 24 additions and 28 deletions
18
main.go
18
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)
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue