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