in pkg/proxy/server.go [37:110]
func NewServer(cfg *cfg.Config, awsCfg *aws.Config, sess *session.Session) (*Server, error) {
_, err := net.ResolveTCPAddr("tcp", cfg.Socket.TCPAddress)
if err != nil {
log.Errorf("%v", err)
os.Exit(1)
}
endPoint, er := getServiceEndpoint(awsCfg)
if er != nil {
return nil, fmt.Errorf("%v", er)
}
log.Infof("HTTP Proxy server using X-Ray Endpoint : %v", endPoint)
// Parse url from endpoint
url, err := url.Parse(endPoint)
if err != nil {
return nil, fmt.Errorf("unable to parse xray endpoint: %v", err)
}
signer := &v4.Signer{
Credentials: sess.Config.Credentials,
}
transport := conn.ProxyServerTransport(cfg)
// Reverse proxy handler
handler := &httputil.ReverseProxy{
Transport: transport,
// Handler for modifying and forwarding requests
Director: func(req *http.Request) {
if req != nil && req.URL != nil {
log.Debugf("Received request on HTTP Proxy server : %s", req.URL.String())
} else {
log.Debug("Request/Request.URL received on HTTP Proxy server is nil")
}
// Remove connection header before signing request, otherwise the
// reverse-proxy will remove the header before forwarding to X-Ray
// resulting in a signed header being missing from the request.
req.Header.Del(connHeader)
// Set req url to xray endpoint
req.URL.Scheme = url.Scheme
req.URL.Host = url.Host
req.Host = url.Host
// Consume body and convert to io.ReadSeeker for signer to consume
body, err := consume(req.Body)
if err != nil {
log.Errorf("Unable to consume request body: %v", err)
// Forward unsigned request
return
}
// Sign request. signer.Sign() also repopulates the request body.
_, err = signer.Sign(req, body, service, *awsCfg.Region, time.Now())
if err != nil {
log.Errorf("Unable to sign request: %v", err)
}
},
}
server := &http.Server{
Addr: cfg.Socket.TCPAddress,
Handler: handler,
}
p := &Server{server}
return p, nil
}