Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java

Issue 2660963002: Cronet: a framework to provide alternative Cronet implementations (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 package org.chromium.net.impl; 4 package org.chromium.net.impl;
5 5
6 import android.content.Context; 6 import android.content.Context;
7 import android.support.annotation.IntDef; 7 import android.support.annotation.IntDef;
8 import android.support.annotation.VisibleForTesting; 8 import android.support.annotation.VisibleForTesting;
9 import android.util.Log;
10 9
11 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_DISABLED; 10 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_DISABLED;
12 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_DISK; 11 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_DISK;
13 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP; 12 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP;
14 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_IN_MEMORY; 13 import static org.chromium.net.CronetEngine.Builder.HTTP_CACHE_IN_MEMORY;
15 14
16 import org.chromium.net.CronetEngine; 15 import org.chromium.net.CronetEngine;
17 import org.chromium.net.ExperimentalCronetEngine;
18 import org.chromium.net.ICronetEngineBuilder; 16 import org.chromium.net.ICronetEngineBuilder;
19 17
20 import java.io.File; 18 import java.io.File;
21 import java.lang.annotation.Retention; 19 import java.lang.annotation.Retention;
22 import java.lang.annotation.RetentionPolicy; 20 import java.lang.annotation.RetentionPolicy;
23 import java.lang.reflect.Constructor;
24 import java.net.IDN; 21 import java.net.IDN;
25 import java.util.Date; 22 import java.util.Date;
26 import java.util.HashSet; 23 import java.util.HashSet;
27 import java.util.LinkedList; 24 import java.util.LinkedList;
28 import java.util.List; 25 import java.util.List;
29 import java.util.Set; 26 import java.util.Set;
30 import java.util.regex.Pattern; 27 import java.util.regex.Pattern;
31 28
32 /** 29 /**
33 * Implementation of {@link ICronetEngineBuilder}. 30 * Implementation of {@link ICronetEngineBuilder}.
34 */ 31 */
35 public class CronetEngineBuilderImpl extends ICronetEngineBuilder { 32 public abstract class CronetEngineBuilderImpl extends ICronetEngineBuilder {
36 /** 33 /**
37 * A hint that a host supports QUIC. 34 * A hint that a host supports QUIC.
38 */ 35 */
39 public static class QuicHint { 36 public static class QuicHint {
40 // The host. 37 // The host.
41 final String mHost; 38 final String mHost;
42 // Port of the server that supports QUIC. 39 // Port of the server that supports QUIC.
43 final int mPort; 40 final int mPort;
44 // Alternate protocol port. 41 // Alternate protocol port.
45 final int mAlternatePort; 42 final int mAlternatePort;
(...skipping 19 matching lines...) Expand all
65 final Date mExpirationDate; 62 final Date mExpirationDate;
66 63
67 Pkp(String host, byte[][] hashes, boolean includeSubdomains, Date expira tionDate) { 64 Pkp(String host, byte[][] hashes, boolean includeSubdomains, Date expira tionDate) {
68 mHost = host; 65 mHost = host;
69 mHashes = hashes; 66 mHashes = hashes;
70 mIncludeSubdomains = includeSubdomains; 67 mIncludeSubdomains = includeSubdomains;
71 mExpirationDate = expirationDate; 68 mExpirationDate = expirationDate;
72 } 69 }
73 } 70 }
74 71
75 private static final String TAG = CronetEngineBuilderImpl.class.getSimpleNam e();
76 private static final String NATIVE_CRONET_IMPL_CLASS =
77 "org.chromium.net.impl.CronetUrlRequestContext";
78 private static final String JAVA_CRONET_IMPL_CLASS = "org.chromium.net.impl. JavaCronetEngine";
79 private static final Pattern INVALID_PKP_HOST_NAME = Pattern.compile("^[0-9\ \.]*$"); 72 private static final Pattern INVALID_PKP_HOST_NAME = Pattern.compile("^[0-9\ \.]*$");
80 73
81 // Private fields are simply storage of configuration for the resulting Cron etEngine. 74 // Private fields are simply storage of configuration for the resulting Cron etEngine.
82 // See setters below for verbose descriptions. 75 // See setters below for verbose descriptions.
83 private final Context mApplicationContext; 76 private final Context mApplicationContext;
84 private final List<QuicHint> mQuicHints = new LinkedList<>(); 77 private final List<QuicHint> mQuicHints = new LinkedList<>();
85 private final List<Pkp> mPkps = new LinkedList<>(); 78 private final List<Pkp> mPkps = new LinkedList<>();
86 private boolean mPublicKeyPinningBypassForLocalTrustAnchorsEnabled; 79 private boolean mPublicKeyPinningBypassForLocalTrustAnchorsEnabled;
87 private String mUserAgent; 80 private String mUserAgent;
88 private String mStoragePath; 81 private String mStoragePath;
89 private boolean mLegacyModeEnabled;
90 private VersionSafeCallbacks.LibraryLoader mLibraryLoader; 82 private VersionSafeCallbacks.LibraryLoader mLibraryLoader;
91 private boolean mQuicEnabled; 83 private boolean mQuicEnabled;
92 private boolean mHttp2Enabled; 84 private boolean mHttp2Enabled;
93 private boolean mSdchEnabled; 85 private boolean mSdchEnabled;
94 private String mDataReductionProxyKey; 86 private String mDataReductionProxyKey;
95 private String mDataReductionProxyPrimaryProxy; 87 private String mDataReductionProxyPrimaryProxy;
96 private String mDataReductionProxyFallbackProxy; 88 private String mDataReductionProxyFallbackProxy;
97 private String mDataReductionProxySecureProxyCheckUrl; 89 private String mDataReductionProxySecureProxyCheckUrl;
98 private boolean mDisableCache; 90 private boolean mDisableCache;
99 private int mHttpCacheMode; 91 private int mHttpCacheMode;
100 private long mHttpCacheMaxSize; 92 private long mHttpCacheMaxSize;
101 private String mExperimentalOptions; 93 private String mExperimentalOptions;
102 private long mMockCertVerifier; 94 protected long mMockCertVerifier;
103 private boolean mNetworkQualityEstimatorEnabled; 95 private boolean mNetworkQualityEstimatorEnabled;
104 private String mCertVerifierData; 96 private String mCertVerifierData;
105 97
106 /** 98 /**
107 * Default config enables SPDY, disables QUIC, SDCH and HTTP cache. 99 * Default config enables SPDY, disables QUIC, SDCH and HTTP cache.
108 * @param context Android {@link Context} for engine to use. 100 * @param context Android {@link Context} for engine to use.
109 */ 101 */
110 public CronetEngineBuilderImpl(Context context) { 102 public CronetEngineBuilderImpl(Context context) {
111 mApplicationContext = context.getApplicationContext(); 103 mApplicationContext = context.getApplicationContext();
112 enableLegacyMode(false);
113 enableQuic(false); 104 enableQuic(false);
114 enableHttp2(true); 105 enableHttp2(true);
115 enableSdch(false); 106 enableSdch(false);
116 enableHttpCache(HTTP_CACHE_DISABLED, 0); 107 enableHttpCache(HTTP_CACHE_DISABLED, 0);
117 enableNetworkQualityEstimator(false); 108 enableNetworkQualityEstimator(false);
118 enablePublicKeyPinningBypassForLocalTrustAnchors(true); 109 enablePublicKeyPinningBypassForLocalTrustAnchors(true);
119 } 110 }
120 111
121 @Override 112 @Override
122 public String getDefaultUserAgent() { 113 public String getDefaultUserAgent() {
(...skipping 17 matching lines...) Expand all
140 } 131 }
141 mStoragePath = value; 132 mStoragePath = value;
142 return this; 133 return this;
143 } 134 }
144 135
145 String storagePath() { 136 String storagePath() {
146 return mStoragePath; 137 return mStoragePath;
147 } 138 }
148 139
149 @Override 140 @Override
150 public CronetEngineBuilderImpl enableLegacyMode(boolean value) {
151 mLegacyModeEnabled = value;
152 return this;
153 }
154
155 private boolean legacyMode() {
156 return mLegacyModeEnabled;
157 }
158
159 @Override
160 public CronetEngineBuilderImpl setLibraryLoader(CronetEngine.Builder.Library Loader loader) { 141 public CronetEngineBuilderImpl setLibraryLoader(CronetEngine.Builder.Library Loader loader) {
161 mLibraryLoader = new VersionSafeCallbacks.LibraryLoader(loader); 142 mLibraryLoader = new VersionSafeCallbacks.LibraryLoader(loader);
162 return this; 143 return this;
163 } 144 }
164 145
165 VersionSafeCallbacks.LibraryLoader libraryLoader() { 146 VersionSafeCallbacks.LibraryLoader libraryLoader() {
166 return mLibraryLoader; 147 return mLibraryLoader;
167 } 148 }
168 149
169 @Override 150 @Override
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 } 415 }
435 416
436 /** 417 /**
437 * Returns {@link Context} for builder. 418 * Returns {@link Context} for builder.
438 * 419 *
439 * @return {@link Context} for builder. 420 * @return {@link Context} for builder.
440 */ 421 */
441 Context getContext() { 422 Context getContext() {
442 return mApplicationContext; 423 return mApplicationContext;
443 } 424 }
444
445 @Override
446 public ExperimentalCronetEngine build() {
447 final ClassLoader loader = getClass().getClassLoader();
448 if (getUserAgent() == null) {
449 setUserAgent(getDefaultUserAgent());
450 }
451
452 ExperimentalCronetEngine cronetEngine = null;
453 if (!legacyMode()) {
454 cronetEngine = createNativeCronetEngine(loader);
455 }
456 if (cronetEngine == null) {
457 cronetEngine = createJavaCronetEngine(loader);
458 }
459
460 if (cronetEngine == null) {
461 Log.i(TAG,
462 "Class loader " + loader + " couldn't find any Cronet engine implementation.");
463 } else {
464 Log.i(TAG, loader.toString() + " found Cronet engine implementation "
465 + cronetEngine.getClass() + ". Network stack version "
466 + cronetEngine.getVersionString());
467 // Clear MOCK_CERT_VERIFIER reference if there is any, since
468 // the ownership has been transferred to the engine.
469 mMockCertVerifier = 0;
470 }
471 return cronetEngine;
472 }
473
474 private ExperimentalCronetEngine createNativeCronetEngine(ClassLoader loader ) {
475 return createCronetEngine(loader, NATIVE_CRONET_IMPL_CLASS, this);
476 }
477
478 private ExperimentalCronetEngine createJavaCronetEngine(ClassLoader loader) {
479 return createCronetEngine(loader, JAVA_CRONET_IMPL_CLASS, getUserAgent() );
480 }
481
482 private ExperimentalCronetEngine createCronetEngine(
483 ClassLoader loader, String name, Object argument) {
484 ExperimentalCronetEngine cronetEngine = null;
485 try {
486 Class<? extends ExperimentalCronetEngine> engineClass =
487 loader.loadClass(name).asSubclass(ExperimentalCronetEngine.c lass);
488 Constructor<? extends ExperimentalCronetEngine> constructor =
489 engineClass.getConstructor(argument.getClass());
490 cronetEngine = constructor.newInstance(argument);
491 } catch (ClassNotFoundException e) {
492 // Leave as null.
493 Log.i(TAG, "Class loader " + loader + " cannot find Cronet engine im plementation: "
494 + name + ". Will try to find an alternative implemen tation.");
495 } catch (Exception e) {
496 throw new IllegalStateException("Cannot instantiate: " + name, e);
497 }
498 return cronetEngine;
499 }
500 } 425 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698