Chromium Code Reviews| Index: components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java |
| diff --git a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java |
| index b02c6f1adf8d27000ab71e6a0838fbf1c3162402..66987f7daa263300dc128974a155d44db6f797ec 100644 |
| --- a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java |
| +++ b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java |
| @@ -4,7 +4,6 @@ |
| package org.chromium.components.variations.firstrun; |
| -import android.content.Context; |
| import android.content.SharedPreferences; |
| import android.os.SystemClock; |
| @@ -23,6 +22,8 @@ import java.net.MalformedURLException; |
| import java.net.SocketTimeoutException; |
| import java.net.URL; |
| import java.net.UnknownHostException; |
| +import java.util.HashMap; |
| +import java.util.Map; |
| import java.util.concurrent.TimeUnit; |
| /** |
| @@ -30,8 +31,15 @@ import java.util.concurrent.TimeUnit; |
| */ |
| public class VariationsSeedFetcher { |
| private static final String TAG = "VariationsSeedFetch"; |
| - private static final String VARIATIONS_SERVER_URL = |
| - "https://clientservices.googleapis.com/chrome-variations/seed?osname=android"; |
| + |
| + public static final String VARIATIONS_PLATFORM = "android"; |
|
Alexei Svitkine (slow)
2017/07/06 22:01:10
Nit: VARIATIONS_PLATFORM_ANDROID
Also, add a blan
|
| + public static final String VARIATIONS_SERVER_URL = |
| + "https://clientservices.googleapis.com/chrome-variations/seed?osname="; |
| + |
| + public static final String SIGNATURE_HEADERFIELD = "X-Seed-Signature"; |
| + public static final String COUNTRY_HEADERFIELD = "X-Country"; |
| + public static final String DATE_HEADERFIELD = "Date"; |
| + public static final String IM_HEADERFIELD = "IM"; |
| private static final int BUFFER_SIZE = 4096; |
| private static final int READ_TIMEOUT = 3000; // time in ms |
| @@ -77,9 +85,8 @@ public class VariationsSeedFetcher { |
| } |
| @VisibleForTesting |
| - protected HttpURLConnection getServerConnection(String restrictMode) |
| + protected HttpURLConnection getServerConnection(String urlString, String restrictMode) |
| throws MalformedURLException, IOException { |
| - String urlString = VARIATIONS_SERVER_URL; |
| if (restrictMode != null && !restrictMode.isEmpty()) { |
| urlString += "&restrict=" + restrictMode; |
| } |
| @@ -95,7 +102,6 @@ public class VariationsSeedFetcher { |
| assert !ThreadUtils.runningOnUiThread(); |
| // Prevent multiple simultaneous fetches |
| synchronized (sLock) { |
| - Context context = ContextUtils.getApplicationContext(); |
| SharedPreferences prefs = ContextUtils.getAppSharedPreferences(); |
| // Early return if an attempt has already been made to fetch the seed, even if it |
| // failed. Only attempt to get the initial Java seed once, since a failure probably |
| @@ -106,7 +112,18 @@ public class VariationsSeedFetcher { |
| || VariationsSeedBridge.hasNativePref()) { |
| return; |
| } |
| - downloadContent(context, restrictMode); |
| + |
| + Map<String, String> headerFields = new HashMap<String, String>(); |
| + byte[] rawSeed = downloadContent( |
| + VARIATIONS_SERVER_URL + VARIATIONS_PLATFORM, restrictMode, headerFields); |
| + if (rawSeed != null) { |
| + String signature = headerFields.get(SIGNATURE_HEADERFIELD); |
| + String country = headerFields.get(COUNTRY_HEADERFIELD); |
| + String date = headerFields.get(DATE_HEADERFIELD); |
| + boolean isGzipCompressed = headerFields.get(IM_HEADERFIELD).equals("gzip"); |
| + VariationsSeedBridge.setVariationsFirstRunSeed( |
| + rawSeed, signature, country, date, isGzipCompressed); |
| + } |
| prefs.edit().putBoolean(VARIATIONS_INITIALIZED_PREF, true).apply(); |
| } |
| } |
| @@ -130,11 +147,13 @@ public class VariationsSeedFetcher { |
| histogram.record(timeDeltaMillis); |
| } |
| - private void downloadContent(Context context, String restrictMode) { |
| + public byte[] downloadContent( |
| + String urlString, String restrictMode, Map<String, String> headFields) { |
| HttpURLConnection connection = null; |
| + byte[] rawSeed = null; |
| try { |
| long startTimeMillis = SystemClock.elapsedRealtime(); |
| - connection = getServerConnection(restrictMode); |
| + connection = getServerConnection(urlString, restrictMode); |
| connection.setReadTimeout(READ_TIMEOUT); |
| connection.setConnectTimeout(REQUEST_TIMEOUT); |
| connection.setDoInput(true); |
| @@ -144,18 +163,18 @@ public class VariationsSeedFetcher { |
| recordFetchResultOrCode(responseCode); |
| if (responseCode != HttpURLConnection.HTTP_OK) { |
| Log.w(TAG, "Non-OK response code = %d", responseCode); |
| - return; |
| + return null; |
| } |
| recordSeedConnectTime(SystemClock.elapsedRealtime() - startTimeMillis); |
| // Convert the InputStream into a byte array. |
| - byte[] rawSeed = getRawSeed(connection); |
| - String signature = getHeaderFieldOrEmpty(connection, "X-Seed-Signature"); |
| - String country = getHeaderFieldOrEmpty(connection, "X-Country"); |
| - String date = getHeaderFieldOrEmpty(connection, "Date"); |
| - boolean isGzipCompressed = getHeaderFieldOrEmpty(connection, "IM").equals("gzip"); |
| - VariationsSeedBridge.setVariationsFirstRunSeed( |
| - rawSeed, signature, country, date, isGzipCompressed); |
| + rawSeed = getRawSeed(connection); |
| + headFields.put(SIGNATURE_HEADERFIELD, |
| + getHeaderFieldOrEmpty(connection, SIGNATURE_HEADERFIELD)); |
| + headFields.put( |
| + COUNTRY_HEADERFIELD, getHeaderFieldOrEmpty(connection, COUNTRY_HEADERFIELD)); |
| + headFields.put(DATE_HEADERFIELD, getHeaderFieldOrEmpty(connection, DATE_HEADERFIELD)); |
| + headFields.put(IM_HEADERFIELD, getHeaderFieldOrEmpty(connection, IM_HEADERFIELD)); |
|
Alexei Svitkine (slow)
2017/07/06 22:01:10
Suggest defining a simple class with these fields
|
| recordSeedFetchTime(SystemClock.elapsedRealtime() - startTimeMillis); |
| } catch (SocketTimeoutException e) { |
| recordFetchResultOrCode(SEED_FETCH_RESULT_TIMEOUT); |
| @@ -171,6 +190,7 @@ public class VariationsSeedFetcher { |
| connection.disconnect(); |
| } |
| } |
| + return rawSeed; |
|
paulmiller
2017/07/06 23:09:05
It looks like this can be null, but AwVariationsSe
|
| } |
| private String getHeaderFieldOrEmpty(HttpURLConnection connection, String name) { |