package httpu
import (
"net/http"
"time"
"golang.org/x/sync/errgroup"
)
type MultiClient struct {
delegates []ClientInterface
}
var _ ClientInterface = &MultiClient {}
func NewMultiClient (delegates []ClientInterface ) *MultiClient {
return &MultiClient {
delegates : delegates ,
}
}
func (mc *MultiClient ) Do (
req *http .Request ,
timeout time .Duration ,
numSends int ,
) ([]*http .Response , error ) {
tasks := &errgroup .Group {}
results := make (chan []*http .Response )
tasks .Go (func () error {
defer close (results )
return mc .sendRequests (results , req , timeout , numSends )
})
var responses []*http .Response
tasks .Go (func () error {
for rs := range results {
responses = append (responses , rs ...)
}
return nil
})
return responses , tasks .Wait ()
}
func (mc *MultiClient ) sendRequests (
results chan <- []*http .Response ,
req *http .Request ,
timeout time .Duration ,
numSends int ,
) error {
tasks := &errgroup .Group {}
for _ , d := range mc .delegates {
d := d
tasks .Go (func () error {
responses , err := d .Do (req , timeout , numSends )
if err != nil {
return err
}
results <- responses
return nil
})
}
return tasks .Wait ()
}
type MultiClientCtx struct {
delegates []ClientInterfaceCtx
}
var _ ClientInterfaceCtx = &MultiClientCtx {}
func NewMultiClientCtx (delegates []ClientInterfaceCtx ) *MultiClientCtx {
return &MultiClientCtx {
delegates : delegates ,
}
}
func (mc *MultiClientCtx ) DoWithContext (
req *http .Request ,
numSends int ,
) ([]*http .Response , error ) {
tasks , ctx := errgroup .WithContext (req .Context ())
req = req .WithContext (ctx )
results := make (chan []*http .Response )
tasks .Go (func () error {
defer close (results )
return mc .sendRequestsCtx (results , req , numSends )
})
var responses []*http .Response
tasks .Go (func () error {
for rs := range results {
responses = append (responses , rs ...)
}
return nil
})
return responses , tasks .Wait ()
}
func (mc *MultiClientCtx ) sendRequestsCtx (
results chan <- []*http .Response ,
req *http .Request ,
numSends int ,
) error {
tasks := &errgroup .Group {}
for _ , d := range mc .delegates {
d := d
tasks .Go (func () error {
responses , err := d .DoWithContext (req , numSends )
if err != nil {
return err
}
results <- responses
return nil
})
}
return tasks .Wait ()
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .