1e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller/* 2e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Copyright (C) 2015 Square, Inc. 3e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * 4e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License"); 5e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * you may not use this file except in compliance with the License. 6e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * You may obtain a copy of the License at 7e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * 8e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * http://www.apache.org/licenses/LICENSE-2.0 9e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * 10e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Unless required by applicable law or agreed to in writing, software 11e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS, 12e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * See the License for the specific language governing permissions and 14e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * limitations under the License. 15e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 16e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerpackage com.squareup.okhttp; 17e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 18e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport com.squareup.okhttp.internal.huc.JavaApiConverter; 19e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 20e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.io.File; 21e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.io.IOException; 22e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.net.CacheRequest; 23e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.net.CacheResponse; 24e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.net.ResponseCache; 25e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.net.URI; 26e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.net.URLConnection; 27e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.util.List; 28e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.util.Map; 29e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 30e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller/** 31e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * A class provided for use by Android so that it can continue supporting a {@link ResponseCache} 32e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * with stats. 33e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 34e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerpublic class AndroidShimResponseCache extends ResponseCache { 35e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 36e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller private final Cache delegate; 37e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 38e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller private AndroidShimResponseCache(Cache delegate) { 39e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller this.delegate = delegate; 40e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 41e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 42e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public static AndroidShimResponseCache create(File directory, long maxSize) throws IOException { 43e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Cache cache = new Cache(directory, maxSize); 44e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return new AndroidShimResponseCache(cache); 45e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 46e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 47e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public boolean isEquivalent(File directory, long maxSize) { 48e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Cache installedCache = getCache(); 49e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return (installedCache.getDirectory().equals(directory) 50e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller && installedCache.getMaxSize() == maxSize 51e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller && !installedCache.isClosed()); 52e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 53e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 54e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public Cache getCache() { 55e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return delegate; 56e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 57e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 58e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller @Override public CacheResponse get(URI uri, String requestMethod, 59e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Map<String, List<String>> requestHeaders) throws IOException { 60e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Request okRequest = JavaApiConverter.createOkRequest(uri, requestMethod, requestHeaders); 61e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Response okResponse = delegate.internalCache.get(okRequest); 62e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller if (okResponse == null) { 63e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return null; 64e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 65e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return JavaApiConverter.createJavaCacheResponse(okResponse); 66e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 67e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 68e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller @Override public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException { 697aeaaefc891f6221f4b2cce536b1c1e816e09794Neil Fuller Response okResponse = JavaApiConverter.createOkResponseForCachePut(uri, urlConnection); 707aeaaefc891f6221f4b2cce536b1c1e816e09794Neil Fuller if (okResponse == null) { 717aeaaefc891f6221f4b2cce536b1c1e816e09794Neil Fuller // The URLConnection is not cacheable or could not be converted. Stop. 727aeaaefc891f6221f4b2cce536b1c1e816e09794Neil Fuller return null; 737aeaaefc891f6221f4b2cce536b1c1e816e09794Neil Fuller } 74e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller com.squareup.okhttp.internal.http.CacheRequest okCacheRequest = 75e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller delegate.internalCache.put(okResponse); 76e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller if (okCacheRequest == null) { 77e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return null; 78e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 79e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return JavaApiConverter.createJavaCacheRequest(okCacheRequest); 80e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 81e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 82e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 83e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Returns the number of bytes currently being used to store the values in 84e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * this cache. This may be greater than the {@link #maxSize} if a background 85e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * deletion is pending. 86e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 87e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public long size() throws IOException { 88e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return delegate.getSize(); 89e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 90e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 91e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 92e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Returns the maximum number of bytes that this cache should use to store 93e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * its data. 94e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 95e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public long maxSize() { 96e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return delegate.getMaxSize(); 97e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 98e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 99e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 100e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Force buffered operations to the filesystem. This ensures that responses 101e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * written to the cache will be available the next time the cache is opened, 102e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * even if this process is killed. 103e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 104e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public void flush() throws IOException { 105e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller delegate.flush(); 106e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 107e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 108e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 109e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Returns the number of HTTP requests that required the network to either 110e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * supply a response or validate a locally cached response. 111e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 112e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public int getNetworkCount() { 113e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return delegate.getNetworkCount(); 114e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 115e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 116e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 117e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Returns the number of HTTP requests whose response was provided by the 118e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * cache. This may include conditional {@code GET} requests that were 119e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * validated over the network. 120e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 121e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public int getHitCount() { 122e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return delegate.getHitCount(); 123e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 124e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 125e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 126e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Returns the total number of HTTP requests that were made. This includes 127e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * both client requests and requests that were made on the client's behalf 128e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * to handle a redirects and retries. 129e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 130e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public int getRequestCount() { 131e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return delegate.getRequestCount(); 132e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 133e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 134e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 135e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Uninstalls the cache and releases any active resources. Stored contents 136e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * will remain on the filesystem. 137e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 138e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public void close() throws IOException { 139e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller delegate.close(); 140e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 141e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 142e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller /** 143e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Uninstalls the cache and deletes all of its stored contents. 144e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 145e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller public void delete() throws IOException { 146e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller delegate.delete(); 147e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 148e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 149e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller} 150