diff --git a/gateway/types/proxy_client.go b/gateway/types/proxy_client.go index 566880b26..9ed1e629f 100644 --- a/gateway/types/proxy_client.go +++ b/gateway/types/proxy_client.go @@ -4,10 +4,13 @@ package types import ( + "fmt" "net" "net/http" "net/url" "time" + + "github.com/openfaas/faas/gateway/version" ) // NewHTTPClientReverseProxy proxies to an upstream host through the use of a http.Client @@ -31,18 +34,20 @@ func NewHTTPClientReverseProxy(baseURL *url.URL, timeout time.Duration, maxIdleC // https://github.com/minio/minio/pull/5860 // Taken from http.DefaultTransport in Go 1.11 - h.Client.Transport = &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: (&net.Dialer{ - Timeout: timeout, - KeepAlive: timeout, - DualStack: true, - }).DialContext, - MaxIdleConns: maxIdleConns, - MaxIdleConnsPerHost: maxIdleConnsPerHost, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, + h.Client.Transport = &proxyTransport{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: timeout, + KeepAlive: timeout, + DualStack: true, + }).DialContext, + MaxIdleConns: maxIdleConns, + MaxIdleConnsPerHost: maxIdleConnsPerHost, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + }, } return &h @@ -54,3 +59,19 @@ type HTTPClientReverseProxy struct { Client *http.Client Timeout time.Duration } + +// proxyTransport is an http.RoundTripper for the reverse proxy client. +// It ensures default headers like the `User-Agent` are set on requests. +type proxyTransport struct { + // Transport is the underlying HTTP transport to use when making requests. + Transport http.RoundTripper +} + +// RoundTrip implements the RoundTripper interface. +func (t *proxyTransport) RoundTrip(req *http.Request) (*http.Response, error) { + if _, ok := req.Header["User-Agent"]; !ok { + req.Header.Set("User-Agent", fmt.Sprintf("openfaas-ce-gateway/%s", version.BuildVersion())) + } + + return t.Transport.RoundTrip(req) +}