From af1c1bd4ecf285e52609a6f35e0de5d538e10b11 Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 23 Aug 2024 16:50:40 -0500 Subject: [PATCH 1/7] OptionalHeaders object Motivation: provides a way to support & encapsulate various values for headers we can pass to the HTTP methods --- .../core/internal/http/impl/OptionalHeaderValues.kt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt new file mode 100644 index 0000000000..72a819a344 --- /dev/null +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt @@ -0,0 +1,5 @@ +package com.onesignal.core.internal.http.impl + +data class OptionalHeaderValues( + var cacheKey: String? = null, +) From e8c2fa11d384fae4c3539d08bf250e11667f7edb Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 23 Aug 2024 16:58:58 -0500 Subject: [PATCH 2/7] Update HTTP Client to take OptionalHeaders object Motivation: we want to avoid adding lots of new method arguments. Better to encapsulate in a single object --- .../core/internal/http/IHttpClient.kt | 11 +++- .../core/internal/http/impl/HttpClient.kt | 62 ++++++++++--------- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt index 7232b43a34..58396c1706 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt @@ -1,5 +1,6 @@ package com.onesignal.core.internal.http +import com.onesignal.core.internal.http.impl.OptionalHeaderValues import org.json.JSONObject /** @@ -18,6 +19,7 @@ interface IHttpClient { suspend fun post( url: String, body: JSONObject, + headerValues: OptionalHeaderValues? = null, ): HttpResponse /** @@ -33,7 +35,7 @@ interface IHttpClient { */ suspend fun get( url: String, - cacheKey: String? = null, + headerValues: OptionalHeaderValues? = null, ): HttpResponse /** @@ -47,6 +49,7 @@ interface IHttpClient { suspend fun put( url: String, body: JSONObject, + headerValues: OptionalHeaderValues? = null, ): HttpResponse /** @@ -60,6 +63,7 @@ interface IHttpClient { suspend fun patch( url: String, body: JSONObject, + headerValues: OptionalHeaderValues? = null, ): HttpResponse /** @@ -69,7 +73,10 @@ interface IHttpClient { * * @return The response returned. */ - suspend fun delete(url: String): HttpResponse + suspend fun delete( + url: String, + headerValues: OptionalHeaderValues? = null, + ): HttpResponse } /** diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt index a3827cb19b..568e1b23ec 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt @@ -45,41 +45,37 @@ internal class HttpClient( override suspend fun post( url: String, body: JSONObject, - ): HttpResponse { - return makeRequest(url, "POST", body, _configModelStore.model.httpTimeout, null) - } + headerValues: OptionalHeaderValues?, + ): HttpResponse = makeRequest(url, "POST", body, _configModelStore.model.httpTimeout, headerValues) override suspend fun get( url: String, - cacheKey: String?, - ): HttpResponse { - return makeRequest(url, null, null, _configModelStore.model.httpGetTimeout, cacheKey) - } + headerValues: OptionalHeaderValues?, + ): HttpResponse = makeRequest(url, null, null, _configModelStore.model.httpGetTimeout, headerValues) override suspend fun put( url: String, body: JSONObject, - ): HttpResponse { - return makeRequest(url, "PUT", body, _configModelStore.model.httpTimeout, null) - } + headerValues: OptionalHeaderValues?, + ): HttpResponse = makeRequest(url, "PUT", body, _configModelStore.model.httpTimeout, headerValues) override suspend fun patch( url: String, body: JSONObject, - ): HttpResponse { - return makeRequest(url, "PATCH", body, _configModelStore.model.httpTimeout, null) - } + headerValues: OptionalHeaderValues?, + ): HttpResponse = makeRequest(url, "PATCH", body, _configModelStore.model.httpTimeout, headerValues) - override suspend fun delete(url: String): HttpResponse { - return makeRequest(url, "DELETE", null, _configModelStore.model.httpTimeout, null) - } + override suspend fun delete( + url: String, + headerValues: OptionalHeaderValues?, + ): HttpResponse = makeRequest(url, "DELETE", null, _configModelStore.model.httpTimeout, headerValues) private suspend fun makeRequest( url: String, method: String?, jsonBody: JSONObject?, timeout: Int, - cacheKey: String?, + headerValues: OptionalHeaderValues?, ): HttpResponse { // If privacy consent is required but not yet given, any non-GET request should be blocked. if (method != null && _configModelStore.model.consentRequired == true && _configModelStore.model.consentGiven != true) { @@ -94,7 +90,7 @@ internal class HttpClient( try { return withTimeout(getThreadTimeout(timeout).toLong()) { - return@withTimeout makeRequestIODispatcher(url, method, jsonBody, timeout, cacheKey) + return@withTimeout makeRequestIODispatcher(url, method, jsonBody, timeout, headerValues) } } catch (e: TimeoutCancellationException) { Logging.error("HttpClient: Request timed out: $url", e) @@ -110,7 +106,7 @@ internal class HttpClient( method: String?, jsonBody: JSONObject?, timeout: Int, - cacheKey: String?, + headerValues: OptionalHeaderValues?, ): HttpResponse { var retVal: HttpResponse? = null @@ -174,11 +170,16 @@ internal class HttpClient( outputStream.write(sendBytes) } - if (cacheKey != null) { - val eTag = _prefs.getString(PreferenceStores.ONESIGNAL, PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + cacheKey) + // H E A D E R S + if (headerValues?.cacheKey != null) { + val eTag = + _prefs.getString( + PreferenceStores.ONESIGNAL, + PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + headerValues.cacheKey, + ) if (eTag != null) { - con.setRequestProperty("if-none-match", eTag) + con.setRequestProperty("If-None-Match", eTag) Logging.debug("HttpClient: Adding header if-none-match: $eTag") } } @@ -195,9 +196,12 @@ internal class HttpClient( val cachedResponse = _prefs.getString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + cacheKey, + PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + headerValues?.cacheKey, ) - Logging.debug("HttpClient: Got Response = ${method ?: "GET"} ${con.url} - Using Cached response due to 304: " + cachedResponse) + Logging.debug( + "HttpClient: Got Response = ${method ?: "GET"} ${con.url} - Using Cached response due to 304: " + + cachedResponse, + ) // TODO: SHOULD RETURN OK INSTEAD OF NOT_MODIFIED TO MAKE TRANSPARENT? retVal = HttpResponse(httpResponse, cachedResponse, retryAfterSeconds = retryAfter) @@ -207,21 +211,23 @@ internal class HttpClient( val scanner = Scanner(inputStream, "UTF-8") val json = if (scanner.useDelimiter("\\A").hasNext()) scanner.next() else "" scanner.close() - Logging.debug("HttpClient: Got Response = ${method ?: "GET"} ${con.url} - STATUS: $httpResponse - Body: " + json) + Logging.debug( + "HttpClient: Got Response = ${method ?: "GET"} ${con.url} - STATUS: $httpResponse - Body: " + json, + ) - if (cacheKey != null) { + if (headerValues?.cacheKey != null) { val eTag = con.getHeaderField("etag") if (eTag != null) { Logging.debug("HttpClient: Got Response = Response has etag of $eTag so caching the response.") _prefs.saveString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + cacheKey, + PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + headerValues.cacheKey, eTag, ) _prefs.saveString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + cacheKey, + PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + headerValues.cacheKey, json, ) } From 3bd4762182757678f03b37565ac6caae8d7dd3d3 Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 23 Aug 2024 17:03:02 -0500 Subject: [PATCH 3/7] Update existing cache key usage to use OptionalHeaders --- .../internal/backend/impl/ParamsBackendService.kt | 5 ++++- .../core/internal/http/HttpClientTests.kt | 15 ++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt index 90da4481b2..d923b8d2ee 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt @@ -13,6 +13,7 @@ import com.onesignal.core.internal.backend.InfluenceParamsObject import com.onesignal.core.internal.backend.ParamsObject import com.onesignal.core.internal.http.CacheKeys import com.onesignal.core.internal.http.IHttpClient +import com.onesignal.core.internal.http.impl.OptionalHeaderValues import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import org.json.JSONObject @@ -31,7 +32,9 @@ internal class ParamsBackendService( paramsUrl += "?player_id=$subscriptionId" } - val response = _http.get(paramsUrl, CacheKeys.REMOTE_PARAMS) + val headers = OptionalHeaderValues() + headers.cacheKey = CacheKeys.REMOTE_PARAMS + val response = _http.get(paramsUrl, headers) if (!response.isSuccess) { throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds) diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt index b2fc8d941b..d00d6a7ddd 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt @@ -3,6 +3,7 @@ package com.onesignal.core.internal.http import com.onesignal.common.OneSignalUtils import com.onesignal.core.internal.device.impl.InstallIdService import com.onesignal.core.internal.http.impl.HttpClient +import com.onesignal.core.internal.http.impl.OptionalHeaderValues import com.onesignal.core.internal.time.impl.Time import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging @@ -88,9 +89,11 @@ class HttpClientTests : FunSpec({ val httpClient = mocks.httpClient // When - val response1 = httpClient.get("URL", "CACHE_KEY") + val headerValues = OptionalHeaderValues() + headerValues.cacheKey = "CACHE_KEY" + val response1 = httpClient.get("URL", headerValues) factory.mockResponse = mockResponse2 - val response2 = httpClient.get("URL", "CACHE_KEY") + val response2 = httpClient.get("URL", headerValues) // Then response1.statusCode shouldBe 200 @@ -123,13 +126,15 @@ class HttpClientTests : FunSpec({ val httpClient = mocks.httpClient // When - val response1 = httpClient.get("URL", "CACHE_KEY") + val headerValues = OptionalHeaderValues() + headerValues.cacheKey = "CACHE_KEY" + val response1 = httpClient.get("URL", headerValues) factory.mockResponse = mockResponse2 - val response2 = httpClient.get("URL", "CACHE_KEY") + val response2 = httpClient.get("URL", headerValues) factory.mockResponse = mockResponse3 - val response3 = httpClient.get("URL", "CACHE_KEY") + val response3 = httpClient.get("URL", headerValues) // Then response1.statusCode shouldBe 200 From c11498083751ecfc26214fe3bab6dc1264cd80dc Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 23 Aug 2024 17:12:58 -0500 Subject: [PATCH 4/7] Add support for Retry-Limit in `HttpClient`, returned in `HttpResponse` Motivation: retry limit logic that is handled earlier in the code path needs to have the limit passed up to it --- .../core/internal/http/HttpResponse.kt | 5 +++++ .../core/internal/http/impl/HttpClient.kt | 20 ++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/HttpResponse.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/HttpResponse.kt index e7785ce6ec..fb62ccc24d 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/HttpResponse.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/HttpResponse.kt @@ -23,6 +23,11 @@ class HttpResponse( * The module handing this should delay any future requests by this time. */ val retryAfterSeconds: Int? = null, + /** + * Optional Integer value may be returned from the backend. + * The module handling this should not retry more than this number. + */ + val retryLimit: Int? = null, ) { /** * Whether the response is a successful one. diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt index 568e1b23ec..340d227ab5 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt @@ -188,6 +188,7 @@ internal class HttpClient( httpResponse = con.responseCode val retryAfter = retryAfterFromResponse(con) + val retryLimit = retryLimitFromResponse(con) val newDelayUntil = _time.currentTimeMillis + (retryAfter ?: 0) * 1_000 if (newDelayUntil > delayNewRequestsUntil) delayNewRequestsUntil = newDelayUntil @@ -204,7 +205,7 @@ internal class HttpClient( ) // TODO: SHOULD RETURN OK INSTEAD OF NOT_MODIFIED TO MAKE TRANSPARENT? - retVal = HttpResponse(httpResponse, cachedResponse, retryAfterSeconds = retryAfter) + retVal = HttpResponse(httpResponse, cachedResponse, retryAfterSeconds = retryAfter, retryLimit = retryLimit) } HttpURLConnection.HTTP_ACCEPTED, HttpURLConnection.HTTP_CREATED, HttpURLConnection.HTTP_OK -> { val inputStream = con.inputStream @@ -233,7 +234,7 @@ internal class HttpClient( } } - retVal = HttpResponse(httpResponse, json, retryAfterSeconds = retryAfter) + retVal = HttpResponse(httpResponse, json, retryAfterSeconds = retryAfter, retryLimit = retryLimit) } else -> { Logging.debug("HttpClient: Got Response = ${method ?: "GET"} ${con.url} - FAILED STATUS: $httpResponse") @@ -254,7 +255,7 @@ internal class HttpClient( Logging.warn("HttpClient: Got Response = $method - STATUS: $httpResponse - No response body!") } - retVal = HttpResponse(httpResponse, jsonResponse, retryAfterSeconds = retryAfter) + retVal = HttpResponse(httpResponse, jsonResponse, retryAfterSeconds = retryAfter, retryLimit = retryLimit) } } } catch (t: Throwable) { @@ -294,6 +295,19 @@ internal class HttpClient( } } + /** + * Reads the HTTP Retry-Limit from the response. + */ + private fun retryLimitFromResponse(con: HttpURLConnection): Int? { + val retryLimitStr = con.getHeaderField("Retry-Limit") + return if (retryLimitStr != null) { + Logging.debug("HttpClient: Response Retry-After: $retryLimitStr") + retryLimitStr.toIntOrNull() + } else { + null + } + } + private fun logHTTPSent( method: String?, url: URL, From 945a278b55fd90159bb8d1014cdf6ff4da15c539 Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Wed, 28 Aug 2024 15:44:12 -0500 Subject: [PATCH 5/7] fixup! OptionalHeaders object --- .../core/internal/http/impl/OptionalHeaderValues.kt | 5 ----- .../com/onesignal/core/internal/http/impl/OptionalHeaders.kt | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt create mode 100644 OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaders.kt diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt deleted file mode 100644 index 72a819a344..0000000000 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaderValues.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.onesignal.core.internal.http.impl - -data class OptionalHeaderValues( - var cacheKey: String? = null, -) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaders.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaders.kt new file mode 100644 index 0000000000..78d870dff6 --- /dev/null +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaders.kt @@ -0,0 +1,5 @@ +package com.onesignal.core.internal.http.impl + +data class OptionalHeaders( + val cacheKey: String? = null, +) From b5ed03fbb86da5193503400887f7826354c7f43a Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Wed, 28 Aug 2024 15:44:30 -0500 Subject: [PATCH 6/7] fixup! Update HTTP Client to take OptionalHeaders object --- .../core/internal/http/IHttpClient.kt | 12 +++--- .../core/internal/http/impl/HttpClient.kt | 38 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt index 58396c1706..47fd789966 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/IHttpClient.kt @@ -1,6 +1,6 @@ package com.onesignal.core.internal.http -import com.onesignal.core.internal.http.impl.OptionalHeaderValues +import com.onesignal.core.internal.http.impl.OptionalHeaders import org.json.JSONObject /** @@ -19,7 +19,7 @@ interface IHttpClient { suspend fun post( url: String, body: JSONObject, - headerValues: OptionalHeaderValues? = null, + headers: OptionalHeaders? = null, ): HttpResponse /** @@ -35,7 +35,7 @@ interface IHttpClient { */ suspend fun get( url: String, - headerValues: OptionalHeaderValues? = null, + headers: OptionalHeaders? = null, ): HttpResponse /** @@ -49,7 +49,7 @@ interface IHttpClient { suspend fun put( url: String, body: JSONObject, - headerValues: OptionalHeaderValues? = null, + headers: OptionalHeaders? = null, ): HttpResponse /** @@ -63,7 +63,7 @@ interface IHttpClient { suspend fun patch( url: String, body: JSONObject, - headerValues: OptionalHeaderValues? = null, + headers: OptionalHeaders? = null, ): HttpResponse /** @@ -75,7 +75,7 @@ interface IHttpClient { */ suspend fun delete( url: String, - headerValues: OptionalHeaderValues? = null, + headers: OptionalHeaders? = null, ): HttpResponse } diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt index 340d227ab5..30b7e93cea 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt @@ -45,37 +45,37 @@ internal class HttpClient( override suspend fun post( url: String, body: JSONObject, - headerValues: OptionalHeaderValues?, - ): HttpResponse = makeRequest(url, "POST", body, _configModelStore.model.httpTimeout, headerValues) + headers: OptionalHeaders?, + ): HttpResponse = makeRequest(url, "POST", body, _configModelStore.model.httpTimeout, headers) override suspend fun get( url: String, - headerValues: OptionalHeaderValues?, - ): HttpResponse = makeRequest(url, null, null, _configModelStore.model.httpGetTimeout, headerValues) + headers: OptionalHeaders?, + ): HttpResponse = makeRequest(url, null, null, _configModelStore.model.httpGetTimeout, headers) override suspend fun put( url: String, body: JSONObject, - headerValues: OptionalHeaderValues?, - ): HttpResponse = makeRequest(url, "PUT", body, _configModelStore.model.httpTimeout, headerValues) + headers: OptionalHeaders?, + ): HttpResponse = makeRequest(url, "PUT", body, _configModelStore.model.httpTimeout, headers) override suspend fun patch( url: String, body: JSONObject, - headerValues: OptionalHeaderValues?, - ): HttpResponse = makeRequest(url, "PATCH", body, _configModelStore.model.httpTimeout, headerValues) + headers: OptionalHeaders?, + ): HttpResponse = makeRequest(url, "PATCH", body, _configModelStore.model.httpTimeout, headers) override suspend fun delete( url: String, - headerValues: OptionalHeaderValues?, - ): HttpResponse = makeRequest(url, "DELETE", null, _configModelStore.model.httpTimeout, headerValues) + headers: OptionalHeaders?, + ): HttpResponse = makeRequest(url, "DELETE", null, _configModelStore.model.httpTimeout, headers) private suspend fun makeRequest( url: String, method: String?, jsonBody: JSONObject?, timeout: Int, - headerValues: OptionalHeaderValues?, + headers: OptionalHeaders?, ): HttpResponse { // If privacy consent is required but not yet given, any non-GET request should be blocked. if (method != null && _configModelStore.model.consentRequired == true && _configModelStore.model.consentGiven != true) { @@ -90,7 +90,7 @@ internal class HttpClient( try { return withTimeout(getThreadTimeout(timeout).toLong()) { - return@withTimeout makeRequestIODispatcher(url, method, jsonBody, timeout, headerValues) + return@withTimeout makeRequestIODispatcher(url, method, jsonBody, timeout, headers) } } catch (e: TimeoutCancellationException) { Logging.error("HttpClient: Request timed out: $url", e) @@ -106,7 +106,7 @@ internal class HttpClient( method: String?, jsonBody: JSONObject?, timeout: Int, - headerValues: OptionalHeaderValues?, + headers: OptionalHeaders?, ): HttpResponse { var retVal: HttpResponse? = null @@ -172,11 +172,11 @@ internal class HttpClient( // H E A D E R S - if (headerValues?.cacheKey != null) { + if (headers?.cacheKey != null) { val eTag = _prefs.getString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + headerValues.cacheKey, + PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + headers.cacheKey, ) if (eTag != null) { con.setRequestProperty("If-None-Match", eTag) @@ -197,7 +197,7 @@ internal class HttpClient( val cachedResponse = _prefs.getString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + headerValues?.cacheKey, + PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + headers?.cacheKey, ) Logging.debug( "HttpClient: Got Response = ${method ?: "GET"} ${con.url} - Using Cached response due to 304: " + @@ -216,19 +216,19 @@ internal class HttpClient( "HttpClient: Got Response = ${method ?: "GET"} ${con.url} - STATUS: $httpResponse - Body: " + json, ) - if (headerValues?.cacheKey != null) { + if (headers?.cacheKey != null) { val eTag = con.getHeaderField("etag") if (eTag != null) { Logging.debug("HttpClient: Got Response = Response has etag of $eTag so caching the response.") _prefs.saveString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + headerValues.cacheKey, + PreferenceOneSignalKeys.PREFS_OS_ETAG_PREFIX + headers.cacheKey, eTag, ) _prefs.saveString( PreferenceStores.ONESIGNAL, - PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + headerValues.cacheKey, + PreferenceOneSignalKeys.PREFS_OS_HTTP_CACHE_PREFIX + headers.cacheKey, json, ) } From 8e973364d93bf7bfdf1ffb4f7763d8f17750caf2 Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Wed, 28 Aug 2024 15:44:59 -0500 Subject: [PATCH 7/7] fixup! Update existing cache key usage to use OptionalHeaders --- .../backend/impl/ParamsBackendService.kt | 6 ++---- .../core/internal/http/HttpClientTests.kt | 18 ++++++++---------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt index d923b8d2ee..85dd452d41 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/backend/impl/ParamsBackendService.kt @@ -13,7 +13,7 @@ import com.onesignal.core.internal.backend.InfluenceParamsObject import com.onesignal.core.internal.backend.ParamsObject import com.onesignal.core.internal.http.CacheKeys import com.onesignal.core.internal.http.IHttpClient -import com.onesignal.core.internal.http.impl.OptionalHeaderValues +import com.onesignal.core.internal.http.impl.OptionalHeaders import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import org.json.JSONObject @@ -32,9 +32,7 @@ internal class ParamsBackendService( paramsUrl += "?player_id=$subscriptionId" } - val headers = OptionalHeaderValues() - headers.cacheKey = CacheKeys.REMOTE_PARAMS - val response = _http.get(paramsUrl, headers) + val response = _http.get(paramsUrl, OptionalHeaders(cacheKey = CacheKeys.REMOTE_PARAMS)) if (!response.isSuccess) { throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds) diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt index d00d6a7ddd..6db113320b 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/http/HttpClientTests.kt @@ -3,7 +3,7 @@ package com.onesignal.core.internal.http import com.onesignal.common.OneSignalUtils import com.onesignal.core.internal.device.impl.InstallIdService import com.onesignal.core.internal.http.impl.HttpClient -import com.onesignal.core.internal.http.impl.OptionalHeaderValues +import com.onesignal.core.internal.http.impl.OptionalHeaders import com.onesignal.core.internal.time.impl.Time import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging @@ -89,11 +89,10 @@ class HttpClientTests : FunSpec({ val httpClient = mocks.httpClient // When - val headerValues = OptionalHeaderValues() - headerValues.cacheKey = "CACHE_KEY" - val response1 = httpClient.get("URL", headerValues) + val headers = OptionalHeaders(cacheKey = "CACHE_KEY") + val response1 = httpClient.get("URL", headers) factory.mockResponse = mockResponse2 - val response2 = httpClient.get("URL", headerValues) + val response2 = httpClient.get("URL", headers) // Then response1.statusCode shouldBe 200 @@ -126,15 +125,14 @@ class HttpClientTests : FunSpec({ val httpClient = mocks.httpClient // When - val headerValues = OptionalHeaderValues() - headerValues.cacheKey = "CACHE_KEY" - val response1 = httpClient.get("URL", headerValues) + val headers = OptionalHeaders(cacheKey = "CACHE_KEY") + val response1 = httpClient.get("URL", headers) factory.mockResponse = mockResponse2 - val response2 = httpClient.get("URL", headerValues) + val response2 = httpClient.get("URL", headers) factory.mockResponse = mockResponse3 - val response3 = httpClient.get("URL", headerValues) + val response3 = httpClient.get("URL", headers) // Then response1.statusCode shouldBe 200