Documentation
¶
Overview ¶
Package nicehttp provides a custom HTTP client with built-in support for rate limiting, automatic retries, and exponential backoff.
Index ¶
- Variables
- func GetAttemptTimeoutFromContext(ctx context.Context) (time.Duration, bool)
- func GetMaxAttemptsFromContext(ctx context.Context) (int, bool)
- func SetAttemptTimeoutInContext(parent context.Context, timeout time.Duration) context.Context
- func SetMaxAttemptsInContext(parent context.Context, attempts int) context.Context
- type Backoff
- type ExponentialBackoff
- type ExponentialBackoffCoefficients
- type Limiter
- type NiceTransport
- type NiceTransportBuilder
- func (b *NiceTransportBuilder) Build() (*NiceTransport, error)
- func (b *NiceTransportBuilder) Set(settings *NiceTransport) *NiceTransportBuilder
- func (b *NiceTransportBuilder) SetAttemptTimeout(timeout time.Duration) *NiceTransportBuilder
- func (b *NiceTransportBuilder) SetDefaultHeaders(headers http.Header) *NiceTransportBuilder
- func (b *NiceTransportBuilder) SetDownstreamTransport(rt http.RoundTripper) *NiceTransportBuilder
- func (b *NiceTransportBuilder) SetLimiterBackoff(backoff Backoff) *NiceTransportBuilder
- func (b *NiceTransportBuilder) SetMaxAttempts(n int) *NiceTransportBuilder
- func (b *NiceTransportBuilder) SetUserAgent(ua string) *NiceTransportBuilder
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var DefaultExponentialBackoff = NewExponentialBackoff(1*time.Second, 120*time.Second, DefaultExponentialBackoffCoefficients)
var DefaultExponentialBackoffCoefficients = ExponentialBackoffCoefficients{
Success: 0.5,
Fail: 1.5,
Jitter: 0.3,
}
var DefaultUserAgent = fmt.Sprintf("nicehttp/%s", getVersion())
var NoTimeout time.Duration = 0
Functions ¶
func GetAttemptTimeoutFromContext ¶ added in v0.2.0
GetAttemptTimeoutFromContext retrieves the timeout value from the context.
func GetMaxAttemptsFromContext ¶ added in v0.2.0
GetMaxAttemptsFromContext retrieves the max attempts value from the context.
func SetAttemptTimeoutInContext ¶ added in v0.2.0
SetAttemptTimeoutInContext returns a new context with the given timeout value.
Types ¶
type ExponentialBackoff ¶ added in v0.2.0
type ExponentialBackoff struct {
// contains filtered or unexported fields
}
func NewExponentialBackoff ¶ added in v0.2.0
func NewExponentialBackoff(minWait time.Duration, maxWait time.Duration, coeff ExponentialBackoffCoefficients) *ExponentialBackoff
func (*ExponentialBackoff) Clone ¶ added in v0.2.0
func (adj *ExponentialBackoff) Clone() Backoff
func (*ExponentialBackoff) Next ¶ added in v0.2.0
func (adj *ExponentialBackoff) Next() time.Time
func (*ExponentialBackoff) UntilNext ¶ added in v0.2.0
func (adj *ExponentialBackoff) UntilNext() time.Duration
type ExponentialBackoffCoefficients ¶ added in v0.2.0
type Limiter ¶ added in v0.2.0
type Limiter struct {
// contains filtered or unexported fields
}
func NewLimiter ¶ added in v0.2.0
type NiceTransport ¶ added in v0.2.0
type NiceTransport struct {
// contains filtered or unexported fields
}
func (*NiceTransport) Clone ¶ added in v0.2.0
func (s *NiceTransport) Clone() *NiceTransport
type NiceTransportBuilder ¶ added in v0.2.0
type NiceTransportBuilder struct {
// contains filtered or unexported fields
}
NiceTransportBuilder is a builder used to create a NiceTransport
func NewNiceTransportBuilder ¶ added in v0.2.0
func NewNiceTransportBuilder() *NiceTransportBuilder
NewNiceTransportBuilder creates a NewNiceTransportBuilder
Example ¶
package main
import (
"context"
"fmt"
"io"
"net/http"
"net/http/httptest"
"time"
"github.com/rohfle/nicehttp"
)
func main() {
// Mock HTTP server
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hello world")
}))
defer server.Close()
headers := make(http.Header)
headers.Set("Authentication", "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
downstream := http.DefaultTransport.(*http.Transport).Clone()
downstream.MaxConnsPerHost = 1
// downstream.TLSClientConfig = &tls.Config{
// InsecureSkipVerify: true, // Skip certificate verification
// }
backoff := nicehttp.NewExponentialBackoff(1*time.Second, 120*time.Second, nicehttp.DefaultExponentialBackoffCoefficients)
// backoff := nicehttp.NewExponentialBackoff(1*time.Second, 120*time.Second, nicehttp.ExponentialBackoffCoefficients{
// Success: 0.5,
// Fail: 1.5,
// Jitter: 0.3,
// })
transport, err := nicehttp.NewNiceTransportBuilder().
SetDefaultHeaders(headers).
SetUserAgent("your-user-agent-here/0.1").
SetMaxAttempts(10).
SetAttemptTimeout(120 * time.Second).
SetLimiterBackoff(backoff).
SetDownstreamTransport(downstream).
Build()
if err != nil {
fmt.Println("error:", err)
return
}
client := &http.Client{
Transport: transport,
Timeout: 10 * time.Minute,
// CheckRedirect:
}
ctx := nicehttp.SetAttemptTimeoutInContext(context.Background(), 5*time.Second)
ctx = nicehttp.SetMaxAttemptsInContext(ctx, 5)
req, err := http.NewRequestWithContext(ctx, "GET", server.URL, nil)
if err != nil {
fmt.Println("error:", err)
return
}
resp, err := client.Do(req)
if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("got resp:", string(data))
}
Output: got resp: hello world
func (*NiceTransportBuilder) Build ¶ added in v0.2.0
func (b *NiceTransportBuilder) Build() (*NiceTransport, error)
Build creates a NiceTransport with settings given previously combined with defaults.
func (*NiceTransportBuilder) Set ¶ added in v0.2.0
func (b *NiceTransportBuilder) Set(settings *NiceTransport) *NiceTransportBuilder
Set sets values of the builder from an existing NiceTransport
func (*NiceTransportBuilder) SetAttemptTimeout ¶ added in v0.2.0
func (b *NiceTransportBuilder) SetAttemptTimeout(timeout time.Duration) *NiceTransportBuilder
A value of 0 means no timeout.
func (*NiceTransportBuilder) SetDefaultHeaders ¶ added in v0.2.0
func (b *NiceTransportBuilder) SetDefaultHeaders(headers http.Header) *NiceTransportBuilder
SetDefaultHeaders sets headers that will be by default included in each request. If this is called multiple times, then existing keys will be overwritten.
func (*NiceTransportBuilder) SetDownstreamTransport ¶ added in v0.2.0
func (b *NiceTransportBuilder) SetDownstreamTransport(rt http.RoundTripper) *NiceTransportBuilder
SetDownstreamTransport sets the downstream transport to be called by RoundTrip
func (*NiceTransportBuilder) SetLimiterBackoff ¶ added in v0.2.0
func (b *NiceTransportBuilder) SetLimiterBackoff(backoff Backoff) *NiceTransportBuilder
If this is not set, the DefaultExponentialBackoff will be used
func (*NiceTransportBuilder) SetMaxAttempts ¶ added in v0.2.0
func (b *NiceTransportBuilder) SetMaxAttempts(n int) *NiceTransportBuilder
SetMaxAttempts sets the maximum number of request attempts that will be made
func (*NiceTransportBuilder) SetUserAgent ¶ added in v0.2.0
func (b *NiceTransportBuilder) SetUserAgent(ua string) *NiceTransportBuilder
SetUserAgent sets the User-Agent in default headers