Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions internal/restclient/config.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright © 2021 Kaleido, Inc.
// Copyright © 2022 Kaleido, Inc.
//
// SPDX-License-Identifier: Apache-2.0
//
Expand All @@ -19,11 +19,16 @@ package restclient
import "github.com/hyperledger/firefly/internal/config"

const (
defaultRetryEnabled = false
defaultRetryCount = 5
defaultRetryWaitTime = "250ms"
defaultRetryMaxWaitTime = "30s"
defaultRequestTimeout = "30s"
defaultRetryEnabled = false
defaultRetryCount = 5
defaultRetryWaitTime = "250ms"
defaultRetryMaxWaitTime = "30s"
defaultRequestTimeout = "30s"
defaultHTTPIdleTimeout = "475ms" // Node.js default keepAliveTimeout is 5 seconds, so we have to set a base below this
defaultHTTPMaxIdleConns = 100 // match Go's default
defaultHTTPConnectionTimeout = "30s"
defaultHTTPTLSHandshakeTimeout = "10s" // match Go's default
defaultHTTPExpectContinueTimeout = "1s" // match Go's default
)

const (
Expand All @@ -47,6 +52,16 @@ const (
HTTPConfigRetryMaxDelay = "retry.maxWaitTime"
// HTTPConfigRequestTimeout the request timeout
HTTPConfigRequestTimeout = "requestTimeout"
// HTTPIdleTimeout the max duration to hold a HTTP keepalive connection between calls
HTTPIdleTimeout = "idleTimeout"
// HTTPMaxIdleConns the max number of idle connections to hold pooled
HTTPMaxIdleConns = "maxIdleConns"
// HTTPConnectionTimeout the connection timeout for new connections
HTTPConnectionTimeout = "connectionTimeout"
// HTTPTLSHandshakeTimeout the TLS handshake connection timeout
HTTTPTLSHandshakeTimeout = "tlsHandshakeTimeout"
// HTTPExpectContinueTimeout see ExpectContinueTimeout in Go docs
HTTPExpectContinueTimeout = "expectContinueTimeout"

// HTTPCustomClient - unit test only - allows injection of a custom HTTP client to resty
HTTPCustomClient = "customClient"
Expand All @@ -63,6 +78,11 @@ func InitPrefix(prefix config.KeySet) {
prefix.AddKnownKey(HTTPConfigRetryInitDelay, defaultRetryWaitTime)
prefix.AddKnownKey(HTTPConfigRetryMaxDelay, defaultRetryMaxWaitTime)
prefix.AddKnownKey(HTTPConfigRequestTimeout, defaultRequestTimeout)
prefix.AddKnownKey(HTTPIdleTimeout, defaultHTTPIdleTimeout)
prefix.AddKnownKey(HTTPMaxIdleConns, defaultHTTPMaxIdleConns)
prefix.AddKnownKey(HTTPConnectionTimeout, defaultHTTPConnectionTimeout)
prefix.AddKnownKey(HTTTPTLSHandshakeTimeout, defaultHTTPTLSHandshakeTimeout)
prefix.AddKnownKey(HTTPExpectContinueTimeout, defaultHTTPExpectContinueTimeout)

prefix.AddKnownKey(HTTPCustomClient)
}
20 changes: 18 additions & 2 deletions internal/restclient/ffresty.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright © 2021 Kaleido, Inc.
// Copyright © 2022 Kaleido, Inc.
//
// SPDX-License-Identifier: Apache-2.0
//
Expand All @@ -21,6 +21,7 @@ import (
"encoding/base64"
"fmt"
"io/ioutil"
"net"
"net/http"
"strings"
"time"
Expand Down Expand Up @@ -70,7 +71,22 @@ func New(ctx context.Context, staticConfig config.Prefix) *resty.Client {
}
}
if client == nil {
client = resty.New()
httpTransport := &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: staticConfig.GetDuration(HTTPConnectionTimeout),
KeepAlive: staticConfig.GetDuration(HTTPConnectionTimeout),
}).DialContext,
ForceAttemptHTTP2: true,
MaxIdleConns: staticConfig.GetInt(HTTPMaxIdleConns),
IdleConnTimeout: staticConfig.GetDuration(HTTPIdleTimeout),
TLSHandshakeTimeout: staticConfig.GetDuration(HTTTPTLSHandshakeTimeout),
ExpectContinueTimeout: staticConfig.GetDuration(HTTPExpectContinueTimeout),
}
httpClient := &http.Client{
Transport: httpTransport,
}
client = resty.NewWithClient(httpClient)
}

url := strings.TrimSuffix(staticConfig.GetString(HTTPConfigURL), "/")
Expand Down