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