| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package org.chromium.net; | |
| 6 | |
| 7 import org.json.JSONArray; | |
| 8 import org.json.JSONException; | |
| 9 import org.json.JSONObject; | |
| 10 | |
| 11 import java.io.File; | |
| 12 | |
| 13 /** | |
| 14 * A config for UrlRequestContext, which allows runtime configuration of | |
| 15 * UrlRequestContext. | |
| 16 */ | |
| 17 public class UrlRequestContextConfig { | |
| 18 private final JSONObject mConfig; | |
| 19 | |
| 20 /** | |
| 21 * Default config enables SPDY, disables QUIC, SDCH and http cache. | |
| 22 */ | |
| 23 public UrlRequestContextConfig() { | |
| 24 mConfig = new JSONObject(); | |
| 25 enableLegacyMode(false); | |
| 26 enableQUIC(false); | |
| 27 enableHTTP2(true); | |
| 28 enableSDCH(false); | |
| 29 enableHttpCache(HTTP_CACHE_DISABLED, 0); | |
| 30 } | |
| 31 | |
| 32 /** | |
| 33 * Creates a config from a JSON string, which was serialized using | |
| 34 * {@link #toString}. | |
| 35 */ | |
| 36 public UrlRequestContextConfig(String json) throws JSONException { | |
| 37 mConfig = new JSONObject(json); | |
| 38 } | |
| 39 | |
| 40 /** | |
| 41 * Overrides the user-agent header for all requests. | |
| 42 * @return the config to facilitate chaining. | |
| 43 */ | |
| 44 public UrlRequestContextConfig setUserAgent(String userAgent) { | |
| 45 return putString(UrlRequestContextConfigList.USER_AGENT, userAgent); | |
| 46 } | |
| 47 | |
| 48 String userAgent() { | |
| 49 return mConfig.optString(UrlRequestContextConfigList.USER_AGENT); | |
| 50 } | |
| 51 | |
| 52 /** | |
| 53 * Sets directory for HTTP Cache and Cookie Storage. The directory must | |
| 54 * exist. | |
| 55 * @param value path to existing directory. | |
| 56 * @return the config to facilitate chaining. | |
| 57 */ | |
| 58 public UrlRequestContextConfig setStoragePath(String value) { | |
| 59 if (!new File(value).isDirectory()) { | |
| 60 throw new IllegalArgumentException( | |
| 61 "Storage path must be set to existing directory"); | |
| 62 } | |
| 63 | |
| 64 return putString(UrlRequestContextConfigList.STORAGE_PATH, value); | |
| 65 } | |
| 66 | |
| 67 String storagePath() { | |
| 68 return mConfig.optString(UrlRequestContextConfigList.STORAGE_PATH); | |
| 69 } | |
| 70 | |
| 71 /** | |
| 72 * Sets whether falling back to implementation based on system's | |
| 73 * {@link java.net.HttpURLConnection} implementation is enabled. | |
| 74 * Defaults to disabled. | |
| 75 * @return the config to facilitate chaining. | |
| 76 * @deprecated Not supported by the new API. | |
| 77 */ | |
| 78 @Deprecated | |
| 79 public UrlRequestContextConfig enableLegacyMode(boolean value) { | |
| 80 return putBoolean(UrlRequestContextConfigList.ENABLE_LEGACY_MODE, | |
| 81 value); | |
| 82 } | |
| 83 | |
| 84 boolean legacyMode() { | |
| 85 return mConfig.optBoolean( | |
| 86 UrlRequestContextConfigList.ENABLE_LEGACY_MODE); | |
| 87 } | |
| 88 | |
| 89 /** | |
| 90 * Overrides the name of the native library backing Cronet. | |
| 91 * @return the config to facilitate chaining. | |
| 92 */ | |
| 93 UrlRequestContextConfig setLibraryName(String libName) { | |
| 94 return putString(UrlRequestContextConfigList.NATIVE_LIBRARY_NAME, | |
| 95 libName); | |
| 96 } | |
| 97 | |
| 98 String libraryName() { | |
| 99 return mConfig.optString( | |
| 100 UrlRequestContextConfigList.NATIVE_LIBRARY_NAME, "cronet"); | |
| 101 } | |
| 102 | |
| 103 /** | |
| 104 * Sets whether <a href="https://www.chromium.org/quic">QUIC</a> protocol | |
| 105 * is enabled. Defaults to disabled. | |
| 106 * @return the config to facilitate chaining. | |
| 107 */ | |
| 108 public UrlRequestContextConfig enableQUIC(boolean value) { | |
| 109 return putBoolean(UrlRequestContextConfigList.ENABLE_QUIC, value); | |
| 110 } | |
| 111 | |
| 112 /** | |
| 113 * Sets whether <a href="https://tools.ietf.org/html/rfc7540">HTTP/2</a> | |
| 114 * protocol is enabled. Defaults to enabled. | |
| 115 * @return the config to facilitate chaining. | |
| 116 */ | |
| 117 public UrlRequestContextConfig enableHTTP2(boolean value) { | |
| 118 return putBoolean(UrlRequestContextConfigList.ENABLE_SPDY, value); | |
| 119 } | |
| 120 | |
| 121 /** | |
| 122 * Sets whether | |
| 123 * <a | |
| 124 * href="https://lists.w3.org/Archives/Public/ietf-http-wg/2008JulSep/att-04
41/Shared_Dictionary_Compression_over_HTTP.pdf"> | |
| 125 * SDCH</a> compression is enabled. Defaults to disabled. | |
| 126 * @return the config to facilitate chaining. | |
| 127 */ | |
| 128 public UrlRequestContextConfig enableSDCH(boolean value) { | |
| 129 return putBoolean(UrlRequestContextConfigList.ENABLE_SDCH, value); | |
| 130 } | |
| 131 | |
| 132 /** | |
| 133 * Enables | |
| 134 * <a href="https://developer.chrome.com/multidevice/data-compression">Data | |
| 135 * Reduction Proxy</a>. Defaults to disabled. | |
| 136 * @param key key to use when authenticating with the proxy. | |
| 137 * @return the config to facilitate chaining. | |
| 138 */ | |
| 139 public UrlRequestContextConfig enableDataReductionProxy(String key) { | |
| 140 return (putString( | |
| 141 UrlRequestContextConfigList.DATA_REDUCTION_PROXY_KEY, key)); | |
| 142 } | |
| 143 | |
| 144 /** | |
| 145 * Overrides | |
| 146 * <a href="https://developer.chrome.com/multidevice/data-compression"> | |
| 147 * Data Reduction Proxy</a> configuration parameters with a primary | |
| 148 * proxy name, fallback proxy name, and a secure proxy check URL. Proxies | |
| 149 * are specified as [scheme://]host[:port]. Used for testing. | |
| 150 * @param primaryProxy the primary data reduction proxy to use. | |
| 151 * @param fallbackProxy a fallback data reduction proxy to use. | |
| 152 * @param secureProxyCheckUrl a URL to fetch to determine if using a secure | |
| 153 * proxy is allowed. | |
| 154 * @return the config to facilitate chaining. | |
| 155 * @hide | |
| 156 */ | |
| 157 public UrlRequestContextConfig setDataReductionProxyOptions( | |
| 158 String primaryProxy, | |
| 159 String fallbackProxy, | |
| 160 String secureProxyCheckUrl) { | |
| 161 if (primaryProxy.isEmpty() || fallbackProxy.isEmpty() | |
| 162 || secureProxyCheckUrl.isEmpty()) { | |
| 163 throw new IllegalArgumentException( | |
| 164 "Primary and fallback proxies and check url must be set"); | |
| 165 } | |
| 166 putString(UrlRequestContextConfigList.DATA_REDUCTION_PRIMARY_PROXY, | |
| 167 primaryProxy); | |
| 168 putString(UrlRequestContextConfigList.DATA_REDUCTION_FALLBACK_PROXY, | |
| 169 fallbackProxy); | |
| 170 putString(UrlRequestContextConfigList | |
| 171 .DATA_REDUCTION_SECURE_PROXY_CHECK_URL, secureProxyCheckUrl); | |
| 172 return this; | |
| 173 } | |
| 174 | |
| 175 /** | |
| 176 * Setting to disable HTTP cache. Some data may still be temporarily stored
in memory. | |
| 177 * Passed to {@link #enableHttpCache}. | |
| 178 */ | |
| 179 public static final int HTTP_CACHE_DISABLED = 0; | |
| 180 | |
| 181 /** | |
| 182 * Setting to enable in-memory HTTP cache, including HTTP data. | |
| 183 * Passed to {@link #enableHttpCache}. | |
| 184 */ | |
| 185 public static final int HTTP_CACHE_IN_MEMORY = 1; | |
| 186 | |
| 187 /** | |
| 188 * Setting to enable on-disk cache, excluding HTTP data. | |
| 189 * {@link #setStoragePath} must be called prior to passing this constant to | |
| 190 * {@link #enableHttpCache}. | |
| 191 */ | |
| 192 public static final int HTTP_CACHE_DISK_NO_HTTP = 2; | |
| 193 | |
| 194 /** | |
| 195 * Setting to enable on-disk cache, including HTTP data. | |
| 196 * {@link #setStoragePath} must be called prior to passing this constant to | |
| 197 * {@link #enableHttpCache}. | |
| 198 */ | |
| 199 public static final int HTTP_CACHE_DISK = 3; | |
| 200 | |
| 201 /** | |
| 202 * Enables or disables caching of HTTP data and other information like QUIC | |
| 203 * server information. | |
| 204 * @param cacheMode control location and type of cached data. | |
| 205 * @param maxSize maximum size used to cache data (advisory and maybe | |
| 206 * exceeded at times). | |
| 207 * @return the config to facilitate chaining. | |
| 208 */ | |
| 209 public UrlRequestContextConfig enableHttpCache(int cacheMode, long maxSize)
{ | |
| 210 if (cacheMode == HTTP_CACHE_DISK || cacheMode == HTTP_CACHE_DISK_NO_HTTP
) { | |
| 211 if (storagePath().isEmpty()) { | |
| 212 throw new IllegalArgumentException("Storage path must be set"); | |
| 213 } | |
| 214 } else { | |
| 215 if (!storagePath().isEmpty()) { | |
| 216 throw new IllegalArgumentException( | |
| 217 "Storage path must be empty"); | |
| 218 } | |
| 219 } | |
| 220 putBoolean(UrlRequestContextConfigList.LOAD_DISABLE_CACHE, | |
| 221 cacheMode == HTTP_CACHE_DISABLED || cacheMode == HTTP_CACHE_DISK
_NO_HTTP); | |
| 222 putLong(UrlRequestContextConfigList.HTTP_CACHE_MAX_SIZE, maxSize); | |
| 223 | |
| 224 switch (cacheMode) { | |
| 225 case HTTP_CACHE_DISABLED: | |
| 226 return putString(UrlRequestContextConfigList.HTTP_CACHE, | |
| 227 UrlRequestContextConfigList.HTTP_CACHE_DISABLED); | |
| 228 case HTTP_CACHE_DISK_NO_HTTP: | |
| 229 case HTTP_CACHE_DISK: | |
| 230 return putString(UrlRequestContextConfigList.HTTP_CACHE, | |
| 231 UrlRequestContextConfigList.HTTP_CACHE_DISK); | |
| 232 | |
| 233 case HTTP_CACHE_IN_MEMORY: | |
| 234 return putString(UrlRequestContextConfigList.HTTP_CACHE, | |
| 235 UrlRequestContextConfigList.HTTP_CACHE_MEMORY); | |
| 236 } | |
| 237 return this; | |
| 238 } | |
| 239 | |
| 240 /** | |
| 241 * Adds hint that {@code host} supports QUIC. | |
| 242 * Note that {@link #enableHttpCache enableHttpCache} | |
| 243 * ({@link HttpCache#DISK DISK}) is needed to take advantage of 0-RTT | |
| 244 * connection establishment between sessions. | |
| 245 * | |
| 246 * @param host hostname of the server that supports QUIC. | |
| 247 * @param port host of the server that supports QUIC. | |
| 248 * @param alternatePort alternate port to use for QUIC. | |
| 249 * @return the config to facilitate chaining. | |
| 250 */ | |
| 251 public UrlRequestContextConfig addQuicHint(String host, | |
| 252 int port, | |
| 253 int alternatePort) { | |
| 254 if (host.contains("/")) { | |
| 255 throw new IllegalArgumentException("Illegal QUIC Hint Host: " | |
| 256 + host); | |
| 257 } | |
| 258 try { | |
| 259 JSONArray quicHints = mConfig.optJSONArray( | |
| 260 UrlRequestContextConfigList.QUIC_HINTS); | |
| 261 if (quicHints == null) { | |
| 262 quicHints = new JSONArray(); | |
| 263 mConfig.put(UrlRequestContextConfigList.QUIC_HINTS, quicHints); | |
| 264 } | |
| 265 | |
| 266 JSONObject hint = new JSONObject(); | |
| 267 hint.put(UrlRequestContextConfigList.QUIC_HINT_HOST, host); | |
| 268 hint.put(UrlRequestContextConfigList.QUIC_HINT_PORT, port); | |
| 269 hint.put(UrlRequestContextConfigList.QUIC_HINT_ALT_PORT, | |
| 270 alternatePort); | |
| 271 quicHints.put(hint); | |
| 272 } catch (JSONException e) { | |
| 273 // Intentionally do nothing. | |
| 274 } | |
| 275 return this; | |
| 276 } | |
| 277 | |
| 278 /** | |
| 279 * Sets experimental QUIC connection options, overwriting any pre-existing | |
| 280 * options. List of options is subject to change. | |
| 281 * | |
| 282 * @param quicConnectionOptions comma-separated QUIC options (for example | |
| 283 * "PACE,IW10") to use if QUIC is enabled. | |
| 284 * @return the config to facilitate chaining. | |
| 285 */ | |
| 286 public UrlRequestContextConfig setExperimentalQuicConnectionOptions( | |
| 287 String quicConnectionOptions) { | |
| 288 return putString(UrlRequestContextConfigList.QUIC_OPTIONS, | |
| 289 quicConnectionOptions); | |
| 290 } | |
| 291 | |
| 292 /** | |
| 293 * Get JSON string representation of the config. | |
| 294 */ | |
| 295 @Override | |
| 296 public String toString() { | |
| 297 return mConfig.toString(); | |
| 298 } | |
| 299 | |
| 300 /** | |
| 301 * Sets a boolean value in the config. Returns a reference to the same | |
| 302 * config object, so you can chain put calls together. | |
| 303 * @return the config to facilitate chaining. | |
| 304 */ | |
| 305 private UrlRequestContextConfig putBoolean(String key, boolean value) { | |
| 306 try { | |
| 307 mConfig.put(key, value); | |
| 308 } catch (JSONException e) { | |
| 309 // Intentionally do nothing. | |
| 310 } | |
| 311 return this; | |
| 312 } | |
| 313 | |
| 314 /** | |
| 315 * Sets a long value in the config. Returns a reference to the same | |
| 316 * config object, so you can chain put calls together. | |
| 317 * @return the config to facilitate chaining. | |
| 318 */ | |
| 319 private UrlRequestContextConfig putLong(String key, long value) { | |
| 320 try { | |
| 321 mConfig.put(key, value); | |
| 322 } catch (JSONException e) { | |
| 323 // Intentionally do nothing. | |
| 324 } | |
| 325 return this; | |
| 326 } | |
| 327 | |
| 328 /** | |
| 329 * Sets a string value in the config. Returns a reference to the same | |
| 330 * config object, so you can chain put calls together. | |
| 331 * @return the config to facilitate chaining. | |
| 332 */ | |
| 333 private UrlRequestContextConfig putString(String key, String value) { | |
| 334 try { | |
| 335 mConfig.put(key, value); | |
| 336 } catch (JSONException e) { | |
| 337 // Intentionally do nothing. | |
| 338 } | |
| 339 return this; | |
| 340 } | |
| 341 } | |
| OLD | NEW |