aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr <r@freesoftwareextremist.com>2020-10-30 17:07:06 +0000
committerr <r@freesoftwareextremist.com>2020-10-30 17:07:06 +0000
commit140dfe2f638e755fa137995a29f2f44aa0b8c310 (patch)
tree1fe05a7c767451dee658521a9d4ac5329025f4ab
parent237182c171beafc2d823fa6ea319bdd7e7209190 (diff)
downloadbloat-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.go18
-rw-r--r--mastodon/mastodon.go34
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,
}
}