1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)package org.chromium.net; 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.json.JSONArray; 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)import org.json.JSONException; 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)import org.json.JSONObject; 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * A config for HttpUrlRequestFactory, which allows runtime configuration of 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * HttpUrlRequestFactory. 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)public class HttpUrlRequestFactoryConfig { 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Default config enables SPDY, QUIC, in memory http cache. 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig() { 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) enableLegacyMode(false); 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) enableQUIC(false); 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) enableSPDY(true); 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) enableHttpCache(HttpCache.IN_MEMORY, 100 * 1024); 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Override the name of the native library backing cronet. 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public HttpUrlRequestFactoryConfig setLibraryName(String libName) { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return putString(UrlRequestContextConfig.NATIVE_LIBRARY_NAME, libName); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Create config from json serialized using @toString. 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig(String json) throws JSONException { 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mConfig = new JSONObject(json); 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Boolean, use HttpUrlRequest-based implementation if true. All other 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * keys are not applicable. 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig enableLegacyMode(boolean value) { 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putBoolean(UrlRequestContextConfig.ENABLE_LEGACY_MODE, value); 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci boolean legacyMode() { 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return mConfig.optBoolean(UrlRequestContextConfig.ENABLE_LEGACY_MODE); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Boolean, enable QUIC if true. 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig enableQUIC(boolean value) { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putBoolean(UrlRequestContextConfig.ENABLE_QUIC, value); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Boolean, enable SPDY if true. 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig enableSPDY(boolean value) { 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putBoolean(UrlRequestContextConfig.ENABLE_SPDY, value); 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci String libraryName() { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mConfig.optString(UrlRequestContextConfig.NATIVE_LIBRARY_NAME, 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "cronet"); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Enumeration, Disable or Enable Disk or Memory Cache and specify its 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * maximum size in bytes. 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public enum HttpCache { DISABLED, IN_MEMORY, DISK }; 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig enableHttpCache(HttpCache value, 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) long maxSize) { 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch(value) { 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case DISABLED: 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putString(UrlRequestContextConfig.HTTP_CACHE, 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UrlRequestContextConfig.HTTP_CACHE_DISABLED); 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case DISK: 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) putLong(UrlRequestContextConfig.HTTP_CACHE_MAX_SIZE, maxSize); 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putString(UrlRequestContextConfig.HTTP_CACHE, 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UrlRequestContextConfig.HTTP_CACHE_DISK); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case IN_MEMORY: 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) putLong(UrlRequestContextConfig.HTTP_CACHE_MAX_SIZE, maxSize); 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putString(UrlRequestContextConfig.HTTP_CACHE, 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UrlRequestContextConfig.HTTP_CACHE_MEMORY); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return this; 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * String, path to directory for HTTP Cache and Cookie Storage. 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public HttpUrlRequestFactoryConfig setStoragePath(String value) { 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return putString(UrlRequestContextConfig.STORAGE_PATH, value); 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Explicitly mark |host| as supporting QUIC. 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Note that enableHttpCache(DISK) is needed to take advantage of 0-RTT 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * connection establishment between sessions. 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param host of the server that supports QUIC. 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param port of the server that supports QUIC. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param alternatePort to use for QUIC. 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public HttpUrlRequestFactoryConfig addQuicHint(String host, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int port, 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int alternatePort) { 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci try { 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci JSONArray quicHints = mConfig.optJSONArray( 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UrlRequestContextConfig.QUIC_HINTS); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (quicHints == null) { 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quicHints = new JSONArray(); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mConfig.put(UrlRequestContextConfig.QUIC_HINTS, quicHints); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci JSONObject hint = new JSONObject(); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hint.put(UrlRequestContextConfig.QUIC_HINT_HOST, host); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hint.put(UrlRequestContextConfig.QUIC_HINT_PORT, port); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hint.put(UrlRequestContextConfig.QUIC_HINT_ALT_PORT, alternatePort); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quicHints.put(hint); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } catch (JSONException e) { 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return this; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Get JSON string representation of the config. 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public String toString() { 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return mConfig.toString(); 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Sets a boolean value in the config. Returns a reference to the same 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * config object, so you can chain put calls together. 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private HttpUrlRequestFactoryConfig putBoolean(String key, boolean value) { 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) try { 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mConfig.put(key, value); 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } catch (JSONException e) { 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ; 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return this; 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Sets a long value in the config. Returns a reference to the same 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * config object, so you can chain put calls together. 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private HttpUrlRequestFactoryConfig putLong(String key, long value) { 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) try { 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mConfig.put(key, value); 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } catch (JSONException e) { 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ; 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return this; 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /** 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Sets a string value in the config. Returns a reference to the same 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * config object, so you can chain put calls together. 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private HttpUrlRequestFactoryConfig putString(String key, String value) { 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) try { 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mConfig.put(key, value); 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } catch (JSONException e) { 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ; 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return this; 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private JSONObject mConfig = new JSONObject(); 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 181