package com.github.droidfu.cachefu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import com.github.droidfu.http.CachedHttpResponse.ResponseData; /** * Allows caching HTTP responses (only status code and payload at the moment) using the features * provided by {@link AbstractCache}. The key into the cache will be the request URL used to * retrieve the HTTP response in the first place. * * @author Matthias Kaeppler * */ public class HttpResponseCache extends AbstractCache<String, ResponseData> { public HttpResponseCache(int initialCapacity, long expirationInMinutes, int maxConcurrentThreads) { super("HttpCache", initialCapacity, expirationInMinutes, maxConcurrentThreads); } public synchronized void removeAllWithPrefix(String urlPrefix) { CacheHelper.removeAllWithStringPrefix(this, urlPrefix); } @Override public String getFileNameForKey(String url) { return CacheHelper.getFileNameFromUrl(url); } @Override protected ResponseData readValueFromDisk(File file) throws IOException { BufferedInputStream istream = new BufferedInputStream(new FileInputStream(file)); long fileSize = file.length(); if (fileSize > Integer.MAX_VALUE) { throw new IOException("Cannot read files larger than " + Integer.MAX_VALUE + " bytes"); } // first byte is the status code int statusCode = istream.read(); // the remainder is the response data int responseDataLength = (int) fileSize - 1; byte[] responseBody = new byte[responseDataLength]; istream.read(responseBody, 0, responseDataLength); istream.close(); return new ResponseData(statusCode, responseBody); } @Override protected void writeValueToDisk(File file, ResponseData data) throws IOException { BufferedOutputStream ostream = new BufferedOutputStream(new FileOutputStream(file)); ostream.write(data.getStatusCode()); ostream.write(data.getResponseBody()); ostream.close(); } }