]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10601 check application version when receiving WS response
authorStas Vilchik <stas.vilchik@sonarsource.com>
Wed, 18 Apr 2018 12:28:15 +0000 (14:28 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 10 May 2018 18:20:53 +0000 (20:20 +0200)
server/sonar-web/src/main/js/helpers/request.ts

index e37923337ee6d48d37f4de396fa915ca6239321b..1b0e075b21e9212a5624029dfc9196bb56348fd8 100644 (file)
@@ -22,6 +22,9 @@ import { omitBy, isNil } from 'lodash';
 import { getCookie } from './cookies';
 import { translate } from './l10n';
 
+/** Current application version. Can be changed if a newer version is deployed. */
+let currentApplicationVersion: string | undefined;
+
 export function getCSRFTokenName(): string {
   return 'X-XSRF-TOKEN';
 }
@@ -142,20 +145,35 @@ export function corsRequest(url: string, mode: RequestMode = 'cors'): Request {
   return request;
 }
 
+function checkApplicationVersion(response: Response): boolean {
+  const version = response.headers.get('Sonar-Version');
+  if (version) {
+    if (currentApplicationVersion && currentApplicationVersion !== version) {
+      window.location.reload();
+      return false;
+    } else {
+      currentApplicationVersion = version;
+    }
+  }
+  return true;
+}
+
 /**
  * Check that response status is ok
  */
 export function checkStatus(response: Response): Promise<Response> {
   return new Promise((resolve, reject) => {
-    if (response.status === 401) {
-      // workaround cyclic dependencies
-      const requireAuthentication = require('../app/utils/handleRequiredAuthentication').default;
-      requireAuthentication();
-      reject();
-    } else if (response.status >= 200 && response.status < 300) {
-      resolve(response);
-    } else {
-      reject({ response });
+    if (checkApplicationVersion(response)) {
+      if (response.status === 401) {
+        // workaround cyclic dependencies
+        const requireAuthentication = require('../app/utils/handleRequiredAuthentication').default;
+        requireAuthentication();
+        reject();
+      } else if (response.status >= 200 && response.status < 300) {
+        resolve(response);
+      } else {
+        reject({ response });
+      }
     }
   });
 }