InMemoryCookieStore.java revision 9f7cb9dbab95a1c94864063908d213487d17535e
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.net; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URI; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.CookieStore; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.HttpCookie; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URISyntaxException; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.List; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.ArrayList; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashMap; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Collections; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Iterator; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.locks.ReentrantLock; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A simple in-memory java.net.CookieStore implementation 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Edward Wang 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass InMemoryCookieStore implements CookieStore { 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the in-memory representation of cookies 48a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 49a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //private List<HttpCookie> cookieJar = null; 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the cookies are indexed by its domain and associated uri (if present) 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // CAUTION: when a cookie removed from main data structure (i.e. cookieJar), 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // it won't be cleared in domainIndex & uriIndex. Double-check the 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // presence of cookie when retrieve one form index store. 55a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //private Map<String, List<HttpCookie>> domainIndex = null; 56a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 57a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Map<URI, List<HttpCookie>> uriIndex = null; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // use ReentrantLock instead of syncronized for scalability 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private ReentrantLock lock = null; 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The default ctor 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public InMemoryCookieStore() { 68a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 69a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //cookieJar = new ArrayList<HttpCookie>(); 70a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //domainIndex = new HashMap<String, List<HttpCookie>>(); 71a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski uriIndex = new HashMap<URI, List<HttpCookie>>(); 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock = new ReentrantLock(false); 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Add one cookie into cookie store. 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void add(URI uri, HttpCookie cookie) { 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // pre-condition : argument can't be null 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cookie == null) { 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException("cookie is null"); 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.lock(); 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 88a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak /* ----- BEGIN android ----- 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // remove the ole cookie if there has had one 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cookieJar.remove(cookie); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // add new cookie if it has a non-zero max-age 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cookie.getMaxAge() != 0) { 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cookieJar.add(cookie); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // and add it to domain index 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cookie.getDomain() != null) { 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addIndex(domainIndex, cookie.getDomain(), cookie); 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (uri != null) { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // add it to uri index, too 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addIndex(uriIndex, getEffectiveURI(uri), cookie); 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 103a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak }*/ 104a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if (cookie.getMaxAge() != 0) { 105a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak addIndex(uriIndex, getEffectiveURI(uri), cookie); 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 107a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.unlock(); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get all cookies, which: 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1) given uri domain-matches with, or, associated with 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * given uri when added to the cookie store. 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3) not expired. 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See RFC 2965 sec. 3.3.4 for more detail. 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public List<HttpCookie> get(URI uri) { 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // argument can't be null 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (uri == null) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException("uri is null"); 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<HttpCookie> cookies = new ArrayList<HttpCookie>(); 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean secureLink = "https".equalsIgnoreCase(uri.getScheme()); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.lock(); 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 131a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak /* ----- BEGIN android ----- 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // check domainIndex first 133a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak getInternal1(cookies, domainIndex, uri.getHost(), secureLink);*/ 134a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak getInternal1(cookies, uriIndex, uri.getHost(), secureLink); 135a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // check uriIndex then 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski getInternal2(cookies, uriIndex, getEffectiveURI(uri), secureLink); 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.unlock(); 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return cookies; 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get all cookies in cookie store, except those have expired 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public List<HttpCookie> getCookies() { 149a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak List<HttpCookie> rt = new ArrayList<HttpCookie>(); 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.lock(); 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 153a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak /* ----- BEGIN android ----- 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<HttpCookie> it = cookieJar.iterator(); 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (it.hasNext()) { 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (it.next().hasExpired()) { 157a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak it.remove();*/ 158a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak 159a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak for (List<HttpCookie> list : uriIndex.values()) { 160a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak Iterator<HttpCookie> it = list.iterator(); 161a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak while (it.hasNext()) { 162a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak HttpCookie cookie = it.next(); 163a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if (cookie.hasExpired()) { 164a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak it.remove(); 165a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak } else if (!rt.contains(cookie)) { 166a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak rt.add(cookie); 167a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak } 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 170a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 172a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 173a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //rt = Collections.unmodifiableList(cookieJar); 174a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak rt = Collections.unmodifiableList(rt); 175a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.unlock(); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return rt; 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get all URIs, which are associated with at least one cookie 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of this cookie store. 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public List<URI> getURIs() { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<URI> uris = new ArrayList<URI>(); 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.lock(); 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 191a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak /* ----- BEGIN android ----- 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<URI> it = uriIndex.keySet().iterator(); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (it.hasNext()) { 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski URI uri = it.next(); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<HttpCookie> cookies = uriIndex.get(uri); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cookies == null || cookies.size() == 0) { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // no cookies list or an empty list associated with 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // this uri entry, delete it 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski it.remove(); 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 201a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak }*/ 202a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak List<URI> result = new ArrayList<URI>(uriIndex.keySet()); 203a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak result.remove(null); 204a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak return Collections.unmodifiableList(result); 205a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski uris.addAll(uriIndex.keySet()); 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.unlock(); 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 211a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 212a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //return uris; 213a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Remove a cookie from store 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean remove(URI uri, HttpCookie ck) { 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // argument can't be null 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ck == null) { 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException("cookie is null"); 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.lock(); 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 2285a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak /* ----- BEGIN android ----- 2295a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak Added uri check */ 230a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak uri = getEffectiveURI(uri); 2319f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath if (uriIndex.get(uri) == null) { 232a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak return false; 2335a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak } else { 234a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak List<HttpCookie> cookies = uriIndex.get(uri); 235a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if (cookies != null) { 236a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak return cookies.remove(ck); 237a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak } else { 238a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak return false; 239a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak } 240a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //modified = cookieJar.remove(ck); 2415a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak /* ----- END android ----- */ 2425a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak } 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.unlock(); 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Remove all cookies in this cookie store. 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean removeAll() { 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.lock(); 2545a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak /* ----- BEGIN android ----- 2555a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak // Added result var */ 2565a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak boolean result = false; 2575a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 259a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // result = !cookieJar.isEmpty(); 260a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak result = !uriIndex.isEmpty(); 261a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //cookieJar.clear(); 262a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak //domainIndex.clear(); 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski uriIndex.clear(); 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lock.unlock(); 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2685a7bc45f8f662d0673779aad34fc595309d93526Przemyslaw Szczepaniak return result; 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* ---------------- Private operations -------------- */ 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This is almost the same as HttpCookie.domainMatches except for 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * one difference: It won't reject cookies when the 'H' part of the 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * domain contains a dot ('.'). 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * I.E.: RFC 2965 section 3.3.2 says that if host is x.y.domain.com 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and the cookie domain is .domain.com, then it should be rejected. 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * However that's not how the real world works. Browsers don't reject and 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * some sites, like yahoo.com do actually expect these cookies to be 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * passed along. 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * And should be used for 'old' style cookies (aka Netscape type of cookies) 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean netscapeDomainMatches(String domain, String host) 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (domain == null || host == null) { 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if there's no embedded dot in domain and domain is not .local 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isLocalDomain = ".local".equalsIgnoreCase(domain); 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int embeddedDotInDomain = domain.indexOf('.'); 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (embeddedDotInDomain == 0) { 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski embeddedDotInDomain = domain.indexOf('.', 1); 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isLocalDomain && (embeddedDotInDomain == -1 || embeddedDotInDomain == domain.length() - 1)) { 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if the host name contains no dot and the domain name is .local 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int firstDotInHost = host.indexOf('.'); 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (firstDotInHost == -1 && isLocalDomain) { 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int domainLength = domain.length(); 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int lengthDiff = host.length() - domainLength; 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lengthDiff == 0) { 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if the host name and the domain name are just string-compare euqal 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return host.equalsIgnoreCase(domain); 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (lengthDiff > 0) { 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // need to check H & D component 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String H = host.substring(0, lengthDiff); 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String D = host.substring(lengthDiff); 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (D.equalsIgnoreCase(domain)); 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (lengthDiff == -1) { 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if domain is actually .host 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (domain.charAt(0) == '.' && 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host.equalsIgnoreCase(domain.substring(1))); 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 328a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 329a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // Removed cookieJar, switched cookieIndex key type from string to URI 330a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak private void getInternal1(List<HttpCookie> cookies, Map<URI, List<HttpCookie>> cookieIndex, 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host, boolean secureLink) { 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Use a separate list to handle cookies that need to be removed so 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // that there is no conflict with iterators. 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ArrayList<HttpCookie> toRemove = new ArrayList<HttpCookie>(); 335a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak for (Map.Entry<URI, List<HttpCookie>> entry : cookieIndex.entrySet()) { 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<HttpCookie> lst = entry.getValue(); 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (HttpCookie c : lst) { 338a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak String domain = c.getDomain(); 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((c.getVersion() == 0 && netscapeDomainMatches(domain, host)) || 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (c.getVersion() == 1 && HttpCookie.domainMatches(domain, host))) { 341a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak 342a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // the cookie still in main cookie store 343a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if (!c.hasExpired()) { 344a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // don't add twice and make sure it's the proper 345a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // security level 346a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if ((secureLink || !c.getSecure()) && 347a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak !cookies.contains(c)) { 348a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak cookies.add(c); 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski toRemove.add(c); 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Clear up the cookies that need to be removed 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (HttpCookie c : toRemove) { 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lst.remove(c); 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski toRemove.clear(); 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 363a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // @param cookies [OUT] contains the found cookies 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // @param cookieIndex the index 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // @param comparator the prediction to decide whether or not 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // a cookie in index should be returned 3699f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath private <T extends Comparable<T>> 3709f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath void getInternal2(List<HttpCookie> cookies, Map<T, List<HttpCookie>> cookieIndex, 3719f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath T comparator, boolean secureLink) 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 373a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 374a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // Removed cookieJar 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (T index : cookieIndex.keySet()) { 3769f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath if ((index == comparator) || (index != null && comparator.compareTo(index) == 0)) { 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<HttpCookie> indexedCookies = cookieIndex.get(index); 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // check the list of cookies associated with this domain 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (indexedCookies != null) { 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<HttpCookie> it = indexedCookies.iterator(); 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (it.hasNext()) { 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski HttpCookie ck = it.next(); 383a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // the cookie still in main cookie store 384a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if (!ck.hasExpired()) { 385a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // don't add twice 386a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if ((secureLink || !ck.getSecure()) && 387a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak !cookies.contains(ck)) 388a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak cookies.add(ck); 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski it.remove(); 391a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // cookieJar.remove(ck); 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } // end of indexedCookies != null 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } // end of comparator.compareTo(index) == 0 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } // end of cookieIndex iteration 397a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // add 'cookie' indexed by 'index' into 'indexStore' 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private <T> void addIndex(Map<T, List<HttpCookie>> indexStore, 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski T index, 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski HttpCookie cookie) 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 4059f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath // Android-changed : "index" can be null. We only use the URI based 4069f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath // index on Android and we want to support null URIs. The underlying 4079f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath // store is a HashMap which will support null keys anyway. 4089f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath List<HttpCookie> cookies = indexStore.get(index); 4099f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath if (cookies != null) { 4109f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath // there may already have the same cookie, so remove it first 4119f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath cookies.remove(cookie); 4129f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath 4139f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath cookies.add(cookie); 4149f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath } else { 4159f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath cookies = new ArrayList<HttpCookie>(); 4169f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath cookies.add(cookie); 4179f7cb9dbab95a1c94864063908d213487d17535eNarayan Kamath indexStore.put(index, cookies); 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // for cookie purpose, the effective uri should only be http://host 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the path will be taken into account when path-match algorithm applied 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private URI getEffectiveURI(URI uri) { 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski URI effectiveURI = null; 428a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- BEGIN android ----- 429a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak if (uri == null) { 430a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak return null; 431a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak } 432a5f1c8ef223a10b956f259d60f715d99ac4f04efPrzemyslaw Szczepaniak // ----- END android ----- 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski effectiveURI = new URI("http", 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski uri.getHost(), 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski null, // path component 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski null, // query component 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski null // fragment component 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ); 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (URISyntaxException ignored) { 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski effectiveURI = uri; 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return effectiveURI; 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 447