Hallucinate a limited http client
This commit is contained in:
2
go.mod
2
go.mod
@@ -1,3 +1,5 @@
|
||||
module git.site.quack-lab.dev/dave/cyutils
|
||||
|
||||
go 1.23.6
|
||||
|
||||
require golang.org/x/time v0.12.0
|
||||
|
2
go.sum
Normal file
2
go.sum
Normal file
@@ -0,0 +1,2 @@
|
||||
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
|
||||
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
40
main.go
40
main.go
@@ -1,7 +1,11 @@
|
||||
package cyutils
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"golang.org/x/time/rate"
|
||||
)
|
||||
|
||||
func WithWorkers[T any](workers int, arr []T, fn func(worker int, item T)) {
|
||||
@@ -40,3 +44,39 @@ func Batched[T any](arr []T, batchSize int, fn func(batch []T)) {
|
||||
fn(batch)
|
||||
}
|
||||
}
|
||||
|
||||
type RateLimitedTransport struct {
|
||||
base http.RoundTripper // Underlying transport
|
||||
limiter *rate.Limiter // Rate limiter
|
||||
}
|
||||
|
||||
// RoundTrip enforces rate limiting before executing the request
|
||||
func (t *RateLimitedTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
ctx := req.Context()
|
||||
if err := t.limiter.Wait(ctx); err != nil {
|
||||
return nil, err // Handle context cancellation/timeout
|
||||
}
|
||||
return t.base.RoundTrip(req)
|
||||
}
|
||||
func LimitedHttp(rps float64, burst int, timeout time.Duration) *http.Client {
|
||||
baseTransport := &http.Transport{
|
||||
MaxIdleConns: 100,
|
||||
MaxIdleConnsPerHost: 10,
|
||||
IdleConnTimeout: 10 * time.Second,
|
||||
}
|
||||
|
||||
// Initialize rate limiter
|
||||
limiter := rate.NewLimiter(rate.Limit(rps), burst)
|
||||
|
||||
// Wrap transport with rate limiting
|
||||
transport := &RateLimitedTransport{
|
||||
base: baseTransport,
|
||||
limiter: limiter,
|
||||
}
|
||||
|
||||
// Return configured client
|
||||
return &http.Client{
|
||||
Transport: transport,
|
||||
Timeout: timeout,
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user