summaryrefslogtreecommitdiff
path: root/adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java')
-rw-r--r--adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java56
1 files changed, 44 insertions, 12 deletions
diff --git a/adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java b/adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java
index 981fe90bcb..143ad7a9c4 100644
--- a/adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java
+++ b/adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java
@@ -18,13 +18,17 @@ package com.android.adservices.service.measurement.registration;
import static com.android.adservices.service.measurement.SystemHealthParams.MAX_ATTRIBUTION_FILTERS;
import static com.android.adservices.service.measurement.SystemHealthParams.MAX_BYTES_PER_ATTRIBUTION_AGGREGATE_KEY_ID;
import static com.android.adservices.service.measurement.SystemHealthParams.MAX_BYTES_PER_ATTRIBUTION_FILTER_STRING;
+import static com.android.adservices.service.measurement.SystemHealthParams.MAX_REDIRECTS_PER_REGISTRATION;
import static com.android.adservices.service.measurement.SystemHealthParams.MAX_VALUES_PER_ATTRIBUTION_FILTER;
import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_MEASUREMENT_REGISTRATIONS;
import android.annotation.NonNull;
import android.net.Uri;
+import com.android.adservices.LogUtil;
import com.android.adservices.service.Flags;
+import com.android.adservices.service.measurement.AsyncRegistration;
+import com.android.adservices.service.measurement.util.AsyncRedirect;
import com.android.adservices.service.measurement.util.Web;
import com.android.adservices.service.stats.AdServicesLogger;
import com.android.adservices.service.stats.MeasurementRegistrationResponseStats;
@@ -44,10 +48,8 @@ import java.util.Map;
* @hide
*/
class FetcherUtil {
- /**
- * Limit recursion.
- */
- static final int REDIRECT_LIMIT = 5;
+ static final String REDIRECT_LIST_HEADER_KEY = "Attribution-Reporting-Redirect";
+ static final String REDIRECT_DAISY_CHAIN_HEADER_KEY = "Location";
/**
* Determine all redirects.
@@ -55,16 +57,23 @@ class FetcherUtil {
* <p>Generates a list of: (url, allows_regular_redirects) tuples. Returns true if all steps
* succeed. Returns false if there are any failures.
*/
- static List<Uri> parseRedirects(@NonNull Map<String, List<String>> headers) {
+ static AsyncRedirect parseRedirects(@NonNull Map<String, List<String>> headers,
+ @AsyncRegistration.RedirectType int redirectType) {
List<Uri> redirects = new ArrayList<>();
- List<String> field = headers.get("Attribution-Reporting-Redirect");
- if (field != null) {
- for (int i = 0; i < Math.min(field.size(), REDIRECT_LIMIT); i++) {
- redirects.add(Uri.parse(field.get(i)));
- }
+ switch (redirectType) {
+ case AsyncRegistration.RedirectType.ANY:
+ if (headers.containsKey(REDIRECT_LIST_HEADER_KEY)) {
+ return parseListRedirects(headers, redirects);
+ } else if (headers.containsKey(REDIRECT_DAISY_CHAIN_HEADER_KEY)) {
+ return parseDaisyChainRedirects(headers, redirects);
+ }
+ return new AsyncRedirect(redirects, AsyncRegistration.RedirectType.NONE);
+ case AsyncRegistration.RedirectType.DAISY_CHAIN:
+ return parseDaisyChainRedirects(headers, redirects);
+ case AsyncRegistration.RedirectType.NONE:
+ default:
+ return new AsyncRedirect(redirects, AsyncRegistration.RedirectType.NONE);
}
-
- return redirects;
}
/**
@@ -157,6 +166,29 @@ class FetcherUtil {
.build());
}
+ private static AsyncRedirect parseListRedirects(Map<String, List<String>> headers,
+ List<Uri> redirects) {
+ List<String> field = headers.get("Attribution-Reporting-Redirect");
+ if (field != null) {
+ for (int i = 0; i < Math.min(field.size(), MAX_REDIRECTS_PER_REGISTRATION); i++) {
+ redirects.add(Uri.parse(field.get(i)));
+ }
+ }
+ return new AsyncRedirect(redirects, AsyncRegistration.RedirectType.NONE);
+ }
+
+ private static AsyncRedirect parseDaisyChainRedirects(
+ Map<String, List<String>> headers, List<Uri> redirects) {
+ List<String> field = headers.get("Location");
+ if (field != null) {
+ redirects.add(Uri.parse(field.get(0)));
+ if (field.size() > 1) {
+ LogUtil.d("Expected one Location redirect only, others ignored!");
+ }
+ }
+ return new AsyncRedirect(redirects, AsyncRegistration.RedirectType.DAISY_CHAIN);
+ }
+
private static long calculateHeadersCharactersLength(Map<String, List<String>> headers) {
long size = 0;
for (String headerKey : headers.keySet()) {