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  }