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 02bbd1094ab780bca94d6ccff43a31e8555f7bae..df07ac03d4ea7e926c5a414586ec28fbdd7dfbe6 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 e5fffdcd31f6232ee060e0dd184e6e448bfb5621..c622c01cdbee90db12d47b2ba57257972322327d 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 = (