Skip to content
Snippets Groups Projects
Commit d77db0ad authored by Sean McGivern's avatar Sean McGivern
Browse files

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.
parent a18363e4
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -10,29 +10,25 @@ export default class PerformanceBarService {
}
 
static registerInterceptor(peekUrl, callback) {
vueResourceInterceptor = (request, next) => {
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 interceptor = response => {
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);
}
 
return response;
});
};
vueResourceInterceptor = (request, next) => next(interceptor);
Vue.http.interceptors.push(vueResourceInterceptor);
return axios.interceptors.response.use(interceptor);
}
 
static removeInterceptor(interceptor) {
Loading
Loading
Loading
Loading
@@ -50,7 +50,7 @@ module Gitlab
 
status_code = Gitlab::PollingInterval.polling_enabled? ? 304 : 429
 
[status_code, { 'ETag' => etag }, []]
[status_code, { 'ETag' => etag, 'X-Gitlab-From-Cache' => 'true' }, []]
end
 
def track_cache_miss(if_none_match, cached_value_present, route)
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment