diff options
Diffstat (limited to 'workhorse/internal/upstream/upstream.go')
-rw-r--r-- | workhorse/internal/upstream/upstream.go | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go index 80e7d4056b6..c41eb98683b 100644 --- a/workhorse/internal/upstream/upstream.go +++ b/workhorse/internal/upstream/upstream.go @@ -8,6 +8,7 @@ package upstream import ( "fmt" + "os" "net/http" "strings" @@ -15,8 +16,10 @@ import ( "github.com/sirupsen/logrus" "gitlab.com/gitlab-org/labkit/correlation" + apipkg "gitlab.com/gitlab-org/gitlab-workhorse/internal/api" "gitlab.com/gitlab-org/gitlab-workhorse/internal/config" "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/log" "gitlab.com/gitlab-org/gitlab-workhorse/internal/rejectmethods" "gitlab.com/gitlab-org/gitlab-workhorse/internal/upload" "gitlab.com/gitlab-org/gitlab-workhorse/internal/upstream/roundtripper" @@ -32,11 +35,13 @@ var ( type upstream struct { config.Config - URLPrefix urlprefix.Prefix - Routes []routeEntry - RoundTripper http.RoundTripper - CableRoundTripper http.RoundTripper - accessLogger *logrus.Logger + URLPrefix urlprefix.Prefix + Routes []routeEntry + RoundTripper http.RoundTripper + CableRoundTripper http.RoundTripper + APIClient *apipkg.API + accessLogger *logrus.Logger + enableGeoProxyFeature bool } func NewUpstream(cfg config.Config, accessLogger *logrus.Logger) http.Handler { @@ -60,6 +65,13 @@ func newUpstream(cfg config.Config, accessLogger *logrus.Logger, routesCallback up.RoundTripper = roundtripper.NewBackendRoundTripper(up.Backend, up.Socket, up.ProxyHeadersTimeout, cfg.DevelopmentMode) up.CableRoundTripper = roundtripper.NewBackendRoundTripper(up.CableBackend, up.CableSocket, up.ProxyHeadersTimeout, cfg.DevelopmentMode) up.configureURLPrefix() + up.APIClient = apipkg.NewAPI( + up.Backend, + up.Version, + up.RoundTripper, + ) + // Kind of a feature flag. See https://gitlab.com/groups/gitlab-org/-/epics/5914#note_564974130 + up.enableGeoProxyFeature = os.Getenv("GEO_SECONDARY_PROXY") == "1" routesCallback(&up) var correlationOpts []correlation.InboundHandlerOption @@ -108,6 +120,17 @@ func (u *upstream) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Look for a matching route var route *routeEntry + + if u.enableGeoProxyFeature { + geoProxyURL, err := u.APIClient.GetGeoProxyURL() + + if err == nil { + log.WithRequest(r).WithFields(log.Fields{"geoProxyURL": geoProxyURL}).Info("Geo Proxy: Set route according to Geo Proxy logic") + } else if err != apipkg.ErrNotGeoSecondary { + log.WithRequest(r).WithError(err).Error("Geo Proxy: Unable to determine Geo Proxy URL. Falling back to normal routing") + } + } + for _, ro := range u.Routes { if ro.isMatch(prefix.Strip(URIPath), r) { route = &ro |