github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/lokifrontend/frontend/downstream_roundtripper.go (about) 1 package frontend 2 3 import ( 4 "net/http" 5 "net/url" 6 "path" 7 8 "github.com/opentracing/opentracing-go" 9 ) 10 11 // RoundTripper that forwards requests to downstream URL. 12 type downstreamRoundTripper struct { 13 downstreamURL *url.URL 14 transport http.RoundTripper 15 } 16 17 func NewDownstreamRoundTripper(downstreamURL string, transport http.RoundTripper) (http.RoundTripper, error) { 18 u, err := url.Parse(downstreamURL) 19 if err != nil { 20 return nil, err 21 } 22 23 return &downstreamRoundTripper{downstreamURL: u, transport: transport}, nil 24 } 25 26 func (d downstreamRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { 27 tracer, span := opentracing.GlobalTracer(), opentracing.SpanFromContext(r.Context()) 28 if tracer != nil && span != nil { 29 carrier := opentracing.HTTPHeadersCarrier(r.Header) 30 err := tracer.Inject(span.Context(), opentracing.HTTPHeaders, carrier) 31 if err != nil { 32 return nil, err 33 } 34 } 35 36 r.URL.Scheme = d.downstreamURL.Scheme 37 r.URL.Host = d.downstreamURL.Host 38 r.URL.Path = path.Join(d.downstreamURL.Path, r.URL.Path) 39 r.Host = "" 40 return d.transport.RoundTrip(r) 41 }