diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 10:00:54 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 10:00:54 +0000 |
commit | 3cccd102ba543e02725d247893729e5c73b38295 (patch) | |
tree | f36a04ec38517f5deaaacb5acc7d949688d1e187 /workhorse/internal/upstream/upstream.go | |
parent | 205943281328046ef7b4528031b90fbda70c75ac (diff) | |
download | gitlab-ce-3cccd102ba543e02725d247893729e5c73b38295.tar.gz |
Add latest changes from gitlab-org/gitlab@14-10-stable-eev14.10.0-rc42
Diffstat (limited to 'workhorse/internal/upstream/upstream.go')
-rw-r--r-- | workhorse/internal/upstream/upstream.go | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go index c0678b1cb3e..6d107fc28cd 100644 --- a/workhorse/internal/upstream/upstream.go +++ b/workhorse/internal/upstream/upstream.go @@ -37,7 +37,6 @@ var ( upload.RewrittenFieldsHeader, } geoProxyApiPollingInterval = 10 * time.Second - geoProxyWorkhorseHeaders = map[string]string{"Gitlab-Workhorse-Geo-Proxy": "1"} ) type upstream struct { @@ -48,6 +47,7 @@ type upstream struct { CableRoundTripper http.RoundTripper APIClient *apipkg.API geoProxyBackend *url.URL + geoProxyExtraData string geoLocalRoutes []routeEntry geoProxyCableRoute routeEntry geoProxyRoute routeEntry @@ -215,34 +215,51 @@ func (u *upstream) pollGeoProxyAPI() { // Calls /api/v4/geo/proxy and sets up routes func (u *upstream) callGeoProxyAPI() { - geoProxyURL, err := u.APIClient.GetGeoProxyURL() + geoProxyData, err := u.APIClient.GetGeoProxyData() if err != nil { log.WithError(err).WithFields(log.Fields{"geoProxyBackend": u.geoProxyBackend}).Error("Geo Proxy: Unable to determine Geo Proxy URL. Fallback on cached value.") return } - if u.geoProxyBackend.String() != geoProxyURL.String() { - log.WithFields(log.Fields{"oldGeoProxyURL": u.geoProxyBackend, "newGeoProxyURL": geoProxyURL}).Info("Geo Proxy: URL changed") - u.updateGeoProxyFields(geoProxyURL) + hasProxyDataChanged := false + if u.geoProxyBackend.String() != geoProxyData.GeoProxyURL.String() { + log.WithFields(log.Fields{"oldGeoProxyURL": u.geoProxyBackend, "newGeoProxyURL": geoProxyData.GeoProxyURL}).Info("Geo Proxy: URL changed") + hasProxyDataChanged = true + } + + if u.geoProxyExtraData != geoProxyData.GeoProxyExtraData { + // extra data is usually a JWT, thus not explicitly logging it + log.Info("Geo Proxy: signed data changed") + hasProxyDataChanged = true + } + + if hasProxyDataChanged { + u.updateGeoProxyFieldsFromData(geoProxyData) } } -func (u *upstream) updateGeoProxyFields(geoProxyURL *url.URL) { +func (u *upstream) updateGeoProxyFieldsFromData(geoProxyData *apipkg.GeoProxyData) { u.mu.Lock() defer u.mu.Unlock() - u.geoProxyBackend = geoProxyURL + u.geoProxyBackend = geoProxyData.GeoProxyURL + u.geoProxyExtraData = geoProxyData.GeoProxyExtraData if u.geoProxyBackend.String() == "" { return } + geoProxyWorkhorseHeaders := map[string]string{ + "Gitlab-Workhorse-Geo-Proxy": "1", + "Gitlab-Workhorse-Geo-Proxy-Extra-Data": u.geoProxyExtraData, + } geoProxyRoundTripper := roundtripper.NewBackendRoundTripper(u.geoProxyBackend, "", u.ProxyHeadersTimeout, u.DevelopmentMode) geoProxyUpstream := proxypkg.NewProxy( u.geoProxyBackend, u.Version, geoProxyRoundTripper, proxypkg.WithCustomHeaders(geoProxyWorkhorseHeaders), + proxypkg.WithForcedTargetHostHeader(), ) u.geoProxyCableRoute = u.wsRoute(`^/-/cable\z`, geoProxyUpstream) u.geoProxyRoute = u.route("", "", geoProxyUpstream, withGeoProxy()) |