diff options
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.java | 56 |
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()) { |