router/core/subgraph_transport.go (39 lines of code) (raw):
package core
import (
"net/http"
"go.uber.org/zap"
)
type SubgraphTransport struct {
defaultTransport http.RoundTripper
logger *zap.Logger
subgraphTrippers map[string]*http.Transport
opts *SubgraphTransportOptions
}
func NewSubgraphTransport(transportOpts *SubgraphTransportOptions, roundTripper http.RoundTripper, logger *zap.Logger, proxy ProxyFunc) *SubgraphTransport {
tt := &SubgraphTransport{
defaultTransport: roundTripper,
logger: logger,
subgraphTrippers: map[string]*http.Transport{},
opts: transportOpts,
}
for subgraph, subgraphOpts := range transportOpts.SubgraphMap {
if subgraphOpts != nil {
tt.subgraphTrippers[subgraph] = newHTTPTransport(subgraphOpts, proxy)
}
}
return tt
}
func (tt *SubgraphTransport) RoundTrip(req *http.Request) (*http.Response, error) {
if req == nil {
return nil, nil
}
rq := getRequestContext(req.Context())
if rq == nil {
return nil, nil
}
subgraph := rq.ActiveSubgraph(req)
if subgraph != nil && subgraph.Name != "" && tt.subgraphTrippers[subgraph.Name] != nil {
return tt.subgraphTrippers[subgraph.Name].RoundTrip(req)
}
return tt.defaultTransport.RoundTrip(req)
}