public Entry put(String key, MediaType mediaType, MultivaluedMap<String, String> headers, byte[] cached, int expires, String etag, String lastModified) { return put(new CacheEntry(key, headers, cached, expires, etag, lastModified, mediaType)); } }
public Entry get(String key, MediaType accept) { return internalCache.get(key, accept); }
public LightweightBrowserCache() { this(new MapCache()); }
try BrowserCache.Entry entry = getEntry(request); if (entry == null) return; if (entry.expired()) cache.remove(request.getUri().toString(), entry.getMediaType()); BrowserCache.Header[] headers = entry.getValidationHeaders(); for (BrowserCache.Header header : headers) request.getHeaders().putSingle(header.getName(), header.getValue()); request.abortWith(cachedResponse(entry));
public void updateOnNotModified(ClientRequestContext request, BrowserCache.Entry old, ClientResponseContext response) old.getHeaders().remove(HttpHeaders.CACHE_CONTROL); old.getHeaders().remove(HttpHeaders.EXPIRES); old.getHeaders().remove(HttpHeaders.LAST_MODIFIED); String cc = (String) response.getHeaderString(HttpHeaders.CACHE_CONTROL); String exp = (String) response.getHeaderString(HttpHeaders.EXPIRES); if (cacheControl.isNoCache()) useCacheEntry(response, old); return; old.getHeaders().putSingle(HttpHeaders.CACHE_CONTROL, cc); old.getHeaders().putSingle(HttpHeaders.CACHE_CONTROL, exp); String etag = (String) response.getHeaderString(HttpHeaders.ETAG); if (etag == null) etag = old.getHeaders().getFirst(HttpHeaders.ETAG); else old.getHeaders().putSingle(HttpHeaders.ETAG, etag); old.getHeaders().putSingle(HttpHeaders.LAST_MODIFIED, lastModified); useCacheEntry(response, old); return; BrowserCache.Entry entry = cache.put(request.getUri().toString(), old.getMediaType(), old.getHeaders(), old.getCached(), expires, etag, lastModified); useCacheEntry(response, entry);
public Entry put(String key, MediaType mediaType, MultivaluedMap<String, String> headers, byte[] cached, int expires, String etag, String lastModified) { Entry previousValue = internalCache.get(key, mediaType); int sizeDiff = -1; if (previousValue == null) sizeDiff = cached.length; else sizeDiff = cached.length - previousValue.getCached().length; if (bytes.addAndGet(sizeDiff) > maxBytes) { clear(); bytes.addAndGet(sizeDiff); } return internalCache.put(key, mediaType, headers, cached, expires, etag, lastModified); }
private Response cachedResponse(BrowserCache.Entry entry) { ByteArrayInputStream bais = new ByteArrayInputStream(entry.getCached()); Response.ResponseBuilder builder = Response.ok().entity(bais); for (Map.Entry<String, List<String>> header : entry.getHeaders().entrySet()) { for (String val : header.getValue()) { builder.header(header.getKey(), val); } } return builder.build(); }
@Override public boolean configure(FeatureContext configuration) { if (cache == null) cache = new LightweightBrowserCache(); configuration.property(BrowserCache.class.getName(), cache); configuration.register(new CacheInterceptor(cache)); return true; } }
public Entry put(CacheEntry cacheEntry) { Map<String, Entry> map = cache.get(cacheEntry.getKey()); if (map == null) { map = new ConcurrentHashMap<String, Entry>(); } map.put(cacheEntry.getMediaType().toString(), cacheEntry); cache.put(cacheEntry.getKey(), map); return cacheEntry; }
@Override public void filter(ClientRequestContext request, ClientResponseContext response) throws IOException { if (!request.getMethod().equalsIgnoreCase("GET") || request.getProperty("cached") != null) return; else if (response.getStatus() == 304) { BrowserCache.Entry entry = (BrowserCache.Entry)request.getProperty("expired.cache.entry"); updateOnNotModified(request, entry, response); return; } else if (response.getStatus() == 200) { cache(request, response); } }
protected BrowserCache.Entry getEntry(ClientRequestContext request) throws Exception { String uri = request.getUri().toString(); List<MediaType> acceptableMediaTypes = request.getAcceptableMediaTypes(); BrowserCache.Entry entry = null; if (acceptableMediaTypes.size() > 0) { for (MediaType accept : acceptableMediaTypes) { entry = cache.get(uri, accept); if (entry != null) return entry; if (MediaTypeHelper.isTextLike(accept)) { entry = cache.get(uri, accept.withCharset("UTF-8")); if (entry != null) return entry; } } } else { return cache.getAny(uri); } return null; }
public Entry getAny(String key) { return internalCache.getAny(key); }
public void clear() { internalCache.clear(); bytes.set(0); } }
public CacheEntry(final String key, final MultivaluedMap<String, String> headers, final byte[] cached, final int expires, final String etag, final String lastModified, final MediaType mediaType) { this.key = key; this.cached = cached; this.expires = expires; this.mediaType = mediaType.toString(); this.headers = headers; if (etag != null || lastModified != null) { if (etag != null && lastModified != null) { validationHeaders = new Header[2]; validationHeaders[0] = new Header("If-Modified-Since", lastModified); validationHeaders[1] = new Header("If-None-Match", etag); } else if (etag != null) { validationHeaders = new Header[1]; validationHeaders[0] = new Header("If-None-Match", etag); } else if (lastModified != null) { validationHeaders = new Header[1]; validationHeaders[0] = new Header("If-Modified-Since", lastModified); } } }
private void cache(ClientRequestContext request, ClientResponseContext response) throws IOException { if (response.getStatus() != 200) return; cacheIfPossible(request, response); }
public void cacheIfPossible(ClientRequestContext request, ClientResponseContext response) throws IOException { String cc = (String) response.getHeaderString(HttpHeaders.CACHE_CONTROL); String exp = (String) response.getHeaderString(HttpHeaders.EXPIRES); int expires = -1; if (cc != null) { CacheControl cacheControl = CacheControl.valueOf(cc); if (cacheControl.isNoCache()) return; expires = cacheControl.getMaxAge(); } else if (exp != null) { Date date = DateUtil.parseDate(exp); expires = (int) ((date.getTime() - System.currentTimeMillis()) / 1000); } String lastModified = (String) response.getHeaderString(HttpHeaders.LAST_MODIFIED); String etag = (String) response.getHeaderString(HttpHeaders.ETAG); String contentType = (String) response.getHeaderString(HttpHeaders.CONTENT_TYPE); String accept = (String) request.getHeaderString(HttpHeaders.ACCEPT); byte[] cached = ReadFromStream.readFromStream(1024, response.getEntityStream()); // if Accept is present, use it, if not fallback to response Content-Type MediaType mediaType = accept != null ? MediaType.valueOf(accept) : MediaType.valueOf(contentType); final BrowserCache.Entry entry = cache.put(request.getUri().toString(), mediaType, response.getHeaders(), cached, expires, etag, lastModified); response.setEntityStream(new ByteArrayInputStream(cached)); }
public Entry put(String key, MediaType mediaType, MultivaluedMap<String, String> headers, byte[] cached, int expires, String etag, String lastModified) { return put(new CacheEntry(key, headers, cached, expires, etag, lastModified, mediaType)); } }
private void useCacheEntry(ClientResponseContext response, BrowserCache.Entry entry) { ByteArrayInputStream bais = new ByteArrayInputStream(entry.getCached()); response.setEntityStream(bais); response.setStatus(200); for (Map.Entry<String, List<String>> header : entry.getHeaders().entrySet()) { response.getHeaders().remove(header.getKey()); for (String val : header.getValue()) { response.getHeaders().add(header.getKey(), val); } } }