diff --git a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/blocklist/AppTPBlockListInterceptorApiPlugin.kt b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/blocklist/AppTPBlockListInterceptorApiPlugin.kt index fa4238b01f9b..1994ecfe0ac0 100644 --- a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/blocklist/AppTPBlockListInterceptorApiPlugin.kt +++ b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/blocklist/AppTPBlockListInterceptorApiPlugin.kt @@ -54,9 +54,9 @@ class AppTPBlockListInterceptorApiPlugin @Inject constructor( moshi.adapter(Types.newParameterizedType(Map::class.java, String::class.java, String::class.java)) } override fun intercept(chain: Chain): Response { - val request = chain.request().newBuilder() + val originalRequest = chain.request() - val tdsRequired = chain.request().tag(Invocation::class.java) + val tdsRequired = originalRequest.tag(Invocation::class.java) ?.method() ?.isAnnotationPresent(AppTPTdsRequired::class.java) == true @@ -64,41 +64,46 @@ class AppTPBlockListInterceptorApiPlugin @Inject constructor( appTrackingProtection.isEnabled() } - return if (shouldInterceptRequest) { - logcat { "[AppTP]: Intercepted AppTP TDS Request: ${chain.request()}" } - val activeExperiment = runBlocking { - inventory.activeAppTpTdsFlag()?.also { - it.enroll() - } + if (!shouldInterceptRequest) { + return chain.proceed(originalRequest) + } + + logcat { "[AppTP]: Intercepted AppTP TDS Request: $originalRequest" } + val activeExperiment = runBlocking { + inventory.activeAppTpTdsFlag()?.also { + it.enroll() } - logcat { "[AppTP]: Active experiment: ${activeExperiment?.featureName()}" } - logcat { "[AppTP]: Cohort: ${runBlocking { activeExperiment?.getCohort() }}" } + } + logcat { "[AppTP]: Active experiment: ${activeExperiment?.featureName()}" } + logcat { "[AppTP]: Cohort: ${runBlocking { activeExperiment?.getCohort() }}" } + + if (activeExperiment == null) { + return chain.proceed(originalRequest) + } - activeExperiment?.let { - val config = activeExperiment.getSettings()?.let { - runCatching { - jsonAdapter.fromJson(it) - }.getOrDefault(emptyMap()) - } ?: emptyMap() - val path = when { - runBlocking { activeExperiment.isEnrolledAndEnabled(TREATMENT) } -> config["treatmentUrl"] - runBlocking { activeExperiment.isEnrolledAndEnabled(CONTROL) } -> config["controlUrl"] - else -> config["nextUrl"] - } ?: return chain.proceed(request.build()) - val newURL = "$APPTP_TDS_BASE_URL$path" - logcat { "[AppTP]: Rewrote TDS request URL to $newURL" } - chain.proceed(request.url(newURL).build()).also { response -> - if (!response.isSuccessful) { - pixel.appTPBlocklistExperimentDownloadFailure( - response.code, - activeExperiment.featureName().name, - runBlocking { activeExperiment.getCohort() }?.name.toString(), - ) - } - } - } ?: chain.proceed(request.build()) - } else { - chain.proceed(request.build()) + val config = activeExperiment.getSettings()?.let { + runCatching { + jsonAdapter.fromJson(it) + }.getOrDefault(emptyMap()) + } ?: emptyMap() + + val path = when { + runBlocking { activeExperiment.isEnrolledAndEnabled(TREATMENT) } -> config["treatmentUrl"] + runBlocking { activeExperiment.isEnrolledAndEnabled(CONTROL) } -> config["controlUrl"] + else -> config["nextUrl"] + } ?: return chain.proceed(originalRequest) + + val newURL = "$APPTP_TDS_BASE_URL$path" + logcat { "[AppTP]: Rewrote TDS request URL to $newURL" } + + return chain.proceed(originalRequest.newBuilder().url(newURL).build()).also { response -> + if (!response.isSuccessful) { + pixel.appTPBlocklistExperimentDownloadFailure( + response.code, + activeExperiment.featureName().name, + runBlocking { activeExperiment.getCohort() }?.name.toString(), + ) + } } } diff --git a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/cohort/CohortPixelInterceptor.kt b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/cohort/CohortPixelInterceptor.kt index 4b5032ad37fc..7c87fda53de9 100644 --- a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/cohort/CohortPixelInterceptor.kt +++ b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/cohort/CohortPixelInterceptor.kt @@ -37,20 +37,23 @@ class CohortPixelInterceptor @Inject constructor( private val cohortStore: CohortStore, ) : PixelInterceptorPlugin, Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request().newBuilder() - val pixel = chain.request().url.pathSegments.last() + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() - val url = if (pixel.startsWith(PIXEL_PREFIX) && !EXCEPTIONS.any { exception -> pixel.startsWith(exception) }) { - // IF there is no cohort for ATP we just drop the pixel request - // ELSE we add the cohort param - cohortStore.getCohortStoredLocalDate()?.let { - chain.request().url.newBuilder().addQueryParameter(COHORT_PARAM, cohortCalculator.calculateCohortForDate(it)).build() - } ?: return dummyResponse(chain) - } else { - chain.request().url + if (!pixel.startsWith(PIXEL_PREFIX) || EXCEPTIONS.any { exception -> pixel.startsWith(exception) }) { + return chain.proceed(originalRequest) } - return chain.proceed(request.url(url).build()) + // IF there is no cohort for ATP we just drop the pixel request + val cohortDate = cohortStore.getCohortStoredLocalDate() + ?: return dummyResponse(chain) + + // ELSE we add the cohort param + val url = originalRequest.url.newBuilder() + .addQueryParameter(COHORT_PARAM, cohortCalculator.calculateCohortForDate(cohortDate)) + .build() + + return chain.proceed(originalRequest.newBuilder().url(url).build()) } private fun dummyResponse(chain: Interceptor.Chain): Response { diff --git a/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt b/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt index 12e003c5f15a..4bd062aa6623 100644 --- a/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt +++ b/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt @@ -51,20 +51,28 @@ class PixelParamRemovalInterceptor @Inject constructor( } override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request().newBuilder() - val pixel = chain.request().url.pathSegments.last() - val url = chain.request().url.newBuilder().apply { - val atbs = pixels.filter { it.second.contains(ATB) }.map { it.first } - val versions = pixels.filter { it.second.contains(APP_VERSION) }.map { it.first } - if (atbs.any { pixel.startsWith(it) }) { + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() + + val atbs = pixels.filter { it.second.contains(ATB) }.map { it.first } + val versions = pixels.filter { it.second.contains(APP_VERSION) }.map { it.first } + val shouldRemoveAtb = atbs.any { pixel.startsWith(it) } + val shouldRemoveVersion = versions.any { pixel.startsWith(it) } + + if (!shouldRemoveAtb && !shouldRemoveVersion) { + return chain.proceed(originalRequest) + } + + val url = originalRequest.url.newBuilder().apply { + if (shouldRemoveAtb) { removeAllQueryParameters(AppUrl.ParamKey.ATB) } - if (versions.any { pixel.startsWith(it) }) { + if (shouldRemoveVersion) { removeAllQueryParameters(Pixel.PixelParameter.APP_VERSION) } }.build() - return chain.proceed(request.url(url).build()) + return chain.proceed(originalRequest.newBuilder().url(url).build()) } override fun getInterceptor(): Interceptor { diff --git a/app/src/main/java/com/duckduckgo/app/global/api/PixelReQueryInterceptor.kt b/app/src/main/java/com/duckduckgo/app/global/api/PixelReQueryInterceptor.kt index 55a4bb32193b..8a8c39e26bb3 100644 --- a/app/src/main/java/com/duckduckgo/app/global/api/PixelReQueryInterceptor.kt +++ b/app/src/main/java/com/duckduckgo/app/global/api/PixelReQueryInterceptor.kt @@ -32,16 +32,21 @@ import okhttp3.Response */ class PixelReQueryInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - var url = chain.request().url - val request = chain.request().newBuilder() + val originalRequest = chain.request() + val originalUrlString = originalRequest.url.toUrl().toString() - url = url.toUrl().toString().replace("rq_0_android_${DeviceInfo.FormFactor.PHONE.description}", "rq_0").toHttpUrl() - url = url.toUrl().toString().replace("rq_0_android_${DeviceInfo.FormFactor.TABLET.description}", "rq_0").toHttpUrl() - url = url.toUrl().toString().replace("rq_1_android_${DeviceInfo.FormFactor.PHONE.description}", "rq_1").toHttpUrl() - url = url.toUrl().toString().replace("rq_1_android_${DeviceInfo.FormFactor.TABLET.description}", "rq_1").toHttpUrl() + val modifiedUrlString = originalUrlString + .replace("rq_0_android_${DeviceInfo.FormFactor.PHONE.description}", "rq_0") + .replace("rq_0_android_${DeviceInfo.FormFactor.TABLET.description}", "rq_0") + .replace("rq_1_android_${DeviceInfo.FormFactor.PHONE.description}", "rq_1") + .replace("rq_1_android_${DeviceInfo.FormFactor.TABLET.description}", "rq_1") - logcat { "Pixel interceptor: $url" } + if (modifiedUrlString == originalUrlString) { + return chain.proceed(originalRequest) + } - return chain.proceed(request.url(url).build()) + logcat { "Pixel interceptor: $modifiedUrlString" } + + return chain.proceed(originalRequest.newBuilder().url(modifiedUrlString.toHttpUrl()).build()) } } diff --git a/app/src/main/java/com/duckduckgo/app/pixels/campaign/CampaignPixelParamsAdditionInterceptor.kt b/app/src/main/java/com/duckduckgo/app/pixels/campaign/CampaignPixelParamsAdditionInterceptor.kt index a47db77b99c2..9ecd46e2217d 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/campaign/CampaignPixelParamsAdditionInterceptor.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/campaign/CampaignPixelParamsAdditionInterceptor.kt @@ -38,33 +38,42 @@ class CampaignPixelParamsAdditionInterceptor @Inject constructor( private val additionalPixelParamsDataStore: AdditionalPixelParamsDataStore, ) : Interceptor, PixelInterceptorPlugin { override fun intercept(chain: Chain): Response { - val request = chain.request().newBuilder() - val url = chain.request().url.newBuilder() + val originalRequest = chain.request() - if (additionalPixelParamsFeature.self().isEnabled()) { - val queryParamsString = chain.request().url.query - if (queryParamsString != null) { - val pixel = chain.request().url.pathSegments.last() - pixelsPlugin.getPlugins().forEach { plugin -> - if (plugin.names().any { pixel.startsWith(it) }) { - val queryParams = queryParamsString.toParamsMap() - if (plugin.isEligible(queryParams)) { - runBlocking { - /** - * The additional parameters being collected only apply to a single promotion about a DuckDuckGo product. - * The parameters are temporary, collected in aggregate, and anonymous. - */ - additionalPixelParamsGenerator.generateAdditionalParams().forEach { (key, value) -> - url.addQueryParameter(key, value) - } - } + if (!additionalPixelParamsFeature.self().isEnabled()) { + return chain.proceed(originalRequest) + } + + val queryParamsString = originalRequest.url.query + ?: return chain.proceed(originalRequest) + + val pixel = originalRequest.url.pathSegments.last() + var paramsAdded = false + val urlBuilder = originalRequest.url.newBuilder() + + pixelsPlugin.getPlugins().forEach { plugin -> + if (plugin.names().any { pixel.startsWith(it) }) { + val queryParams = queryParamsString.toParamsMap() + if (plugin.isEligible(queryParams)) { + runBlocking { + /** + * The additional parameters being collected only apply to a single promotion about a DuckDuckGo product. + * The parameters are temporary, collected in aggregate, and anonymous. + */ + additionalPixelParamsGenerator.generateAdditionalParams().forEach { (key, value) -> + urlBuilder.addQueryParameter(key, value) + paramsAdded = true } } } } } - return chain.proceed(request.url(url.build()).build()) + if (!paramsAdded) { + return chain.proceed(originalRequest) + } + + return chain.proceed(originalRequest.newBuilder().url(urlBuilder.build()).build()) } private fun CampaignPixelParamsAdditionPlugin.isEligible(queryParams: Map): Boolean { diff --git a/app/src/main/java/com/duckduckgo/app/trackerdetection/blocklist/BlockListInterceptorApiPlugin.kt b/app/src/main/java/com/duckduckgo/app/trackerdetection/blocklist/BlockListInterceptorApiPlugin.kt index aee6ea266e07..bcbf01bdcd27 100644 --- a/app/src/main/java/com/duckduckgo/app/trackerdetection/blocklist/BlockListInterceptorApiPlugin.kt +++ b/app/src/main/java/com/duckduckgo/app/trackerdetection/blocklist/BlockListInterceptorApiPlugin.kt @@ -50,36 +50,40 @@ class BlockListInterceptorApiPlugin @Inject constructor( moshi.adapter(Types.newParameterizedType(Map::class.java, String::class.java, String::class.java)) } override fun intercept(chain: Chain): Response { - val request = chain.request().newBuilder() + val originalRequest = chain.request() - val tdsRequired = chain.request().tag(Invocation::class.java) + val tdsRequired = originalRequest.tag(Invocation::class.java) ?.method() ?.isAnnotationPresent(TdsRequired::class.java) == true - return if (tdsRequired) { - val activeExperiment = runBlocking { - inventory.activeTdsFlag().also { it?.enroll() } - } + if (!tdsRequired) { + return chain.proceed(originalRequest) + } - activeExperiment?.let { - val config = activeExperiment.getSettings()?.let { - runCatching { - jsonAdapter.fromJson(it) - }.getOrDefault(emptyMap()) - } ?: emptyMap() - val path = when { - runBlocking { activeExperiment.isEnrolledAndEnabled(TREATMENT) } -> config["treatmentUrl"] - runBlocking { activeExperiment.isEnrolledAndEnabled(CONTROL) } -> config["controlUrl"] - else -> config["nextUrl"] - } ?: return chain.proceed(request.build()) - chain.proceed(request.url("$TDS_BASE_URL$path").build()).also { response -> - if (!response.isSuccessful) { - pixel.fire(BLOCKLIST_TDS_FAILURE, mapOf("code" to response.code.toString())) - } - } - } ?: chain.proceed(request.build()) - } else { - chain.proceed(request.build()) + val activeExperiment = runBlocking { + inventory.activeTdsFlag().also { it?.enroll() } + } + + if (activeExperiment == null) { + return chain.proceed(originalRequest) + } + + val config = activeExperiment.getSettings()?.let { + runCatching { + jsonAdapter.fromJson(it) + }.getOrDefault(emptyMap()) + } ?: emptyMap() + + val path = when { + runBlocking { activeExperiment.isEnrolledAndEnabled(TREATMENT) } -> config["treatmentUrl"] + runBlocking { activeExperiment.isEnrolledAndEnabled(CONTROL) } -> config["controlUrl"] + else -> config["nextUrl"] + } ?: return chain.proceed(originalRequest) + + return chain.proceed(originalRequest.newBuilder().url("$TDS_BASE_URL$path").build()).also { response -> + if (!response.isSuccessful) { + pixel.fire(BLOCKLIST_TDS_FAILURE, mapOf("code" to response.code.toString())) + } } } diff --git a/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/pixels/AttributedMetricPixelInterceptor.kt b/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/pixels/AttributedMetricPixelInterceptor.kt index 8afe3cbaa52d..8f996af70eb9 100644 --- a/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/pixels/AttributedMetricPixelInterceptor.kt +++ b/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/pixels/AttributedMetricPixelInterceptor.kt @@ -33,16 +33,21 @@ import javax.inject.Inject class AttributedMetricPixelInterceptor @Inject constructor() : Interceptor, PixelInterceptorPlugin { override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request().newBuilder() - var url = chain.request().url - val pixel = chain.request().url.pathSegments.last() - if (pixel.startsWith(ATTRIBUTED_METRICS_PIXEL_PREFIX)) { - url = url.toUrl().toString().replace("android_${DeviceInfo.FormFactor.PHONE.description}", "android").toHttpUrl() - logcat(tag = "AttributedMetrics") { - "Pixel renamed to: $url" - } + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() + + if (!pixel.startsWith(ATTRIBUTED_METRICS_PIXEL_PREFIX)) { + return chain.proceed(originalRequest) + } + + val url = originalRequest.url.toUrl().toString() + .replace("android_${DeviceInfo.FormFactor.PHONE.description}", "android") + .toHttpUrl() + logcat(tag = "AttributedMetrics") { + "Pixel renamed to: $url" } - return chain.proceed(request.url(url).build()) + + return chain.proceed(originalRequest.newBuilder().url(url).build()) } override fun getInterceptor() = this diff --git a/feature-toggles/feature-toggles-impl/src/main/java/com/duckduckgo/feature/toggles/impl/MetricPixelInterceptor.kt b/feature-toggles/feature-toggles-impl/src/main/java/com/duckduckgo/feature/toggles/impl/MetricPixelInterceptor.kt index e97c4c3a5655..b24e9a821226 100644 --- a/feature-toggles/feature-toggles-impl/src/main/java/com/duckduckgo/feature/toggles/impl/MetricPixelInterceptor.kt +++ b/feature-toggles/feature-toggles-impl/src/main/java/com/duckduckgo/feature/toggles/impl/MetricPixelInterceptor.kt @@ -46,17 +46,19 @@ class MetricPixelInterceptor @Inject constructor( private val pixelStore: MetricsPixelStore, ) : PixelInterceptorPlugin, Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request().newBuilder() - val pixel = chain.request().url.pathSegments.last() + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() // If not a metrics pixel, proceed - if (!pixel.startsWith(METRICS_PIXEL_PREFIX)) return chain.proceed(request.build()) + if (!pixel.startsWith(METRICS_PIXEL_PREFIX)) { + return chain.proceed(originalRequest) + } // If one of the parameters doesn't exist or is empty, drop request - val metricName = chain.request().url.queryParameter("metric") - val value = chain.request().url.queryParameter("value") - val conversionWindowDays = chain.request().url.queryParameter("conversionWindowDays") - val enrollmentDate = chain.request().url.queryParameter("enrollmentDate") + val metricName = originalRequest.url.queryParameter("metric") + val value = originalRequest.url.queryParameter("value") + val conversionWindowDays = originalRequest.url.queryParameter("conversionWindowDays") + val enrollmentDate = originalRequest.url.queryParameter("enrollmentDate") if (metricName.isNullOrEmpty() || value.isNullOrEmpty() || conversionWindowDays.isNullOrEmpty() || enrollmentDate.isNullOrEmpty()) { return dummyResponse(chain) @@ -96,7 +98,7 @@ class MetricPixelInterceptor @Inject constructor( // If inside conversion window, proceed, if not drop val diffDays = daysBetweenTodayAnd(enrollmentDate) return if (diffDays in lowerWindow..upperWindow) { - chain.proceed(request.build()).also { pixelStore.storePixelTag(tag) } + chain.proceed(originalRequest).also { pixelStore.storePixelTag(tag) } } else { dummyResponse(chain) } diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/cohort/NetpCohortPixelInterceptor.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/cohort/NetpCohortPixelInterceptor.kt index c1140e13e6c9..fed34c48217c 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/cohort/NetpCohortPixelInterceptor.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/cohort/NetpCohortPixelInterceptor.kt @@ -36,19 +36,17 @@ class NetpCohortPixelInterceptor @Inject constructor( private val cohortStore: NetpCohortStore, ) : PixelInterceptorPlugin, Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request().newBuilder() - val pixel = chain.request().url.pathSegments.last() + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() - val url = if (pixel.startsWith(PIXEL_PREFIX) && !EXCEPTIONS.any { exception -> pixel.startsWith(exception) }) { + if (pixel.startsWith(PIXEL_PREFIX) && !EXCEPTIONS.any { exception -> pixel.startsWith(exception) }) { // IF there is no cohort for NetP we just drop the pixel request - cohortStore.cohortLocalDate?.let { - chain.request().url.newBuilder().build() - } ?: return dummyResponse(chain) - } else { - chain.request().url + if (cohortStore.cohortLocalDate == null) { + return dummyResponse(chain) + } } - return chain.proceed(request.url(url).build()) + return chain.proceed(originalRequest) } private fun dummyResponse(chain: Interceptor.Chain): Response { diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/pixels/VpnLatencyPixelInterceptor.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/pixels/VpnLatencyPixelInterceptor.kt index f15322149b08..a41bcd516605 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/pixels/VpnLatencyPixelInterceptor.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/pixels/VpnLatencyPixelInterceptor.kt @@ -43,18 +43,19 @@ class VpnLatencyPixelInterceptor @Inject constructor( override fun getInterceptor(): Interceptor = this override fun intercept(chain: Chain): Response { - val request = chain.request().newBuilder() - val pixel = chain.request().url.pathSegments.last() - val url = if (LATENCY_PIXELS.any { pixel.startsWith(it) }) { - chain.request().url.newBuilder() - .addQueryParameter(PARAM_LOCATION, getLocationParamValue()) - .addQueryParameter(PARAM_OSABOVE15, isOsAbove15().toString()) - .build() - } else { - chain.request().url + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() + + if (LATENCY_PIXELS.none { pixel.startsWith(it) }) { + return chain.proceed(originalRequest) } - return chain.proceed(request.url(url).build()) + val url = originalRequest.url.newBuilder() + .addQueryParameter(PARAM_LOCATION, getLocationParamValue()) + .addQueryParameter(PARAM_OSABOVE15, isOsAbove15().toString()) + .build() + + return chain.proceed(originalRequest.newBuilder().url(url).build()) } private fun getLocationParamValue(): String { diff --git a/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/pixels/PirPixelInterceptor.kt b/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/pixels/PirPixelInterceptor.kt index 347dec1cdabd..91b78555c156 100644 --- a/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/pixels/PirPixelInterceptor.kt +++ b/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/pixels/PirPixelInterceptor.kt @@ -37,27 +37,27 @@ class PirPixelInterceptor @Inject constructor( private val appBuildConfig: AppBuildConfig, ) : PixelInterceptorPlugin, Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request().newBuilder() - val pixel = chain.request().url.pathSegments.last() + val originalRequest = chain.request() + val pixel = originalRequest.url.pathSegments.last() - val url = if (pixel.startsWith(PIXEL_PREFIX) && !EXCEPTIONS.any { exception -> pixel.startsWith(exception) }) { - chain.request().url.newBuilder() - .addQueryParameter( - KEY_METADATA, - JSONObject() - .put("os", appBuildConfig.sdkInt) - .put("batteryOptimizations", (!isIgnoringBatteryOptimizations()).toString()) - .put("man", appBuildConfig.manufacturer) - .toString().toByteArray().run { - Base64.encodeToString(this, Base64.NO_WRAP or Base64.NO_PADDING or Base64.URL_SAFE) - }, - ) - .build() - } else { - chain.request().url + if (!pixel.startsWith(PIXEL_PREFIX) || EXCEPTIONS.any { exception -> pixel.startsWith(exception) }) { + return chain.proceed(originalRequest) } - return chain.proceed(request.url(url).build()) + val url = originalRequest.url.newBuilder() + .addQueryParameter( + KEY_METADATA, + JSONObject() + .put("os", appBuildConfig.sdkInt) + .put("batteryOptimizations", (!isIgnoringBatteryOptimizations()).toString()) + .put("man", appBuildConfig.manufacturer) + .toString().toByteArray().run { + Base64.encodeToString(this, Base64.NO_WRAP or Base64.NO_PADDING or Base64.URL_SAFE) + }, + ) + .build() + + return chain.proceed(originalRequest.newBuilder().url(url).build()) } override fun getInterceptor(): Interceptor = this