From 7d41583391b3aa4e679ec939713952344a69f25a Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Wed, 28 Apr 2021 18:46:39 +0200
Subject: [PATCH] Fix app config caching (DEV) (#2997)

* If the server gives us a max-age=0, default to 300s.

* Fix lints.

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../sources/remote/AppConfigServer.kt         | 10 ++++++-
 .../sources/remote/AppConfigServerTest.kt     | 29 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServer.kt
index 02bbd1094..df07ac03d 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServer.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServer.kt
@@ -79,7 +79,15 @@ class AppConfigServer @Inject constructor(
 
         val cacheControl = CacheControl.parse(headers)
 
-        val maxCacheAge = Duration.standardSeconds(cacheControl.maxAgeSeconds.toLong())
+        val maxCacheAge = cacheControl.maxAgeSeconds.let {
+            if (it == 0) {
+                // Server currently returns `Cache-Control	max-age=0, no-cache, no-store` which breaks our caching
+                Timber.tag(TAG).w("Server returned max-age=0: %s", cacheControl)
+                Duration.standardSeconds(300)
+            } else {
+                Duration.standardSeconds(it.toLong())
+            }
+        }
 
         return InternalConfigData(
             rawData = rawConfig,
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServerTest.kt
index e5fffdcd3..c622c01cd 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServerTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/sources/remote/AppConfigServerTest.kt
@@ -229,6 +229,35 @@ class AppConfigServerTest : BaseIOTest() {
         )
     }
 
+    @Test
+    fun `cache control with max-age=0 defaults to 300 seconds`() = runBlockingTest {
+        coEvery { api.getApplicationConfiguration() } returns Response.success(
+            APPCONFIG_BUNDLE.toResponseBody(),
+            Headers.headersOf(
+                "Date",
+                "Tue, 03 Nov 2020 08:46:03 GMT",
+                "ETag",
+                "I am an ETag :)!",
+                "Cache-Control",
+                "max-age=0, no-cache, no-store"
+            )
+        )
+
+        val downloadServer = createInstance()
+
+        val configDownload = downloadServer.downloadAppConfig()
+        configDownload shouldBe InternalConfigData(
+            rawData = APPCONFIG_RAW,
+            serverTime = Instant.parse("2020-11-03T08:46:03.000Z"),
+            localOffset = Duration(
+                Instant.parse("2020-11-03T08:46:03.000Z"),
+                Instant.ofEpochMilli(123456789)
+            ),
+            etag = "I am an ETag :)!",
+            cacheValidity = Duration.standardSeconds(300)
+        )
+    }
+
     companion object {
         private val APPCONFIG_BUNDLE =
             (
-- 
GitLab