Fix flash errors in performance bar for cached responses
When a request contains an ETag value in its If-None-Match header, the backend may send a request ID (from Rack) that does not correspond to a value in Peek's Redis cache (because we aborted the Rails processing in our ETag middleware). Because a cached response (304) has to replace the headers with those from the previous 200 - https://tools.ietf.org/html/rfc7234#section-4.3.4 - we add a custom header that will only be present in cache hits, that can tell the frontend to ignore these.
This commit is contained in:
parent
a18363e48e
commit
d77db0adbd
|
@ -10,29 +10,25 @@ export default class PerformanceBarService {
|
||||||
}
|
}
|
||||||
|
|
||||||
static registerInterceptor(peekUrl, callback) {
|
static registerInterceptor(peekUrl, callback) {
|
||||||
vueResourceInterceptor = (request, next) => {
|
const interceptor = response => {
|
||||||
next(response => {
|
|
||||||
const requestId = response.headers['x-request-id'];
|
|
||||||
const requestUrl = response.url;
|
|
||||||
|
|
||||||
if (requestUrl !== peekUrl && requestId) {
|
|
||||||
callback(requestId, requestUrl);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Vue.http.interceptors.push(vueResourceInterceptor);
|
|
||||||
|
|
||||||
return axios.interceptors.response.use(response => {
|
|
||||||
const requestId = response.headers['x-request-id'];
|
const requestId = response.headers['x-request-id'];
|
||||||
const requestUrl = response.config.url;
|
// Get the request URL from response.config for Axios, and response for
|
||||||
|
// Vue Resource.
|
||||||
|
const requestUrl = (response.config || response).url;
|
||||||
|
const cachedResponse = response.headers['x-gitlab-from-cache'] === 'true';
|
||||||
|
|
||||||
if (requestUrl !== peekUrl && requestId) {
|
if (requestUrl !== peekUrl && requestId && !cachedResponse) {
|
||||||
callback(requestId, requestUrl);
|
callback(requestId, requestUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
});
|
};
|
||||||
|
|
||||||
|
vueResourceInterceptor = (request, next) => next(interceptor);
|
||||||
|
|
||||||
|
Vue.http.interceptors.push(vueResourceInterceptor);
|
||||||
|
|
||||||
|
return axios.interceptors.response.use(interceptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static removeInterceptor(interceptor) {
|
static removeInterceptor(interceptor) {
|
||||||
|
|
|
@ -50,7 +50,7 @@ module Gitlab
|
||||||
|
|
||||||
status_code = Gitlab::PollingInterval.polling_enabled? ? 304 : 429
|
status_code = Gitlab::PollingInterval.polling_enabled? ? 304 : 429
|
||||||
|
|
||||||
[status_code, { 'ETag' => etag }, []]
|
[status_code, { 'ETag' => etag, 'X-Gitlab-From-Cache' => 'true' }, []]
|
||||||
end
|
end
|
||||||
|
|
||||||
def track_cache_miss(if_none_match, cached_value_present, route)
|
def track_cache_miss(if_none_match, cached_value_present, route)
|
||||||
|
|
Loading…
Reference in New Issue