Hallucinate a limited http client

This commit is contained in:
2025-07-22 17:38:47 +02:00
parent cdeaf1de78
commit c07fb20a8a
3 changed files with 44 additions and 0 deletions

2
go.mod
View File

@@ -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
View 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
View File

@@ -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,
}
}