summaryrefslogtreecommitdiff
path: root/adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-11-04 00:41:00 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-11-04 00:41:00 +0000
commit725bf3e2372b8ab29e521e864d28770fdf2c0443 (patch)
treed094f43841ac9dc9c54fd96ffd940b6f71f8ba39 /adservices/service-core/java/com/android/adservices/service/measurement/registration/FetcherUtil.java
parent190c25efdbd5a5bdbb41a2818cf39a05d0ea9be0 (diff)
parent7b99dc653ed133fef81d0423fee87d45299097e2 (diff)
downloadAdServices-android13-mainline-ipsec-release.tar.gz
Snap for 9254005 from 7b99dc653ed133fef81d0423fee87d45299097e2 to mainline-ipsec-releaseaml_ips_331910010aml_ips_331312000aml_ips_331310000android13-mainline-ipsec-release
Change-Id: Id77860bb313cd5104abdea4a778d197a1db28861
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()) {