/* GNU GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net */ package org.lobobrowser.request; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.lobobrowser.util.NameValuePair; import org.lobobrowser.util.io.IORoutines; public class MemoryCacheEntry { public final byte[] content; public final List<NameValuePair> headers; public final Long expiration; public final Object altObject; public final long requestTime; public final int altObjectSize; /** * * @param content * The content of the document without headers. * @param headers * @param expiration * @param altObject * @param altObjectSize */ public MemoryCacheEntry(final byte[] content, final List<NameValuePair> headers, final Long expiration, final Object altObject, final int altObjectSize) { this.content = content; this.headers = headers; this.expiration = expiration; this.altObject = altObject; this.altObjectSize = altObjectSize; this.requestTime = System.currentTimeMillis(); } /** * * @param rawContent * The content of the document, including headers. * @param altObject * @param altObjectSize */ public MemoryCacheEntry(final byte[] rawContent, final Long expires, final long requestTime, final Object altObject, final int altObjectSize) throws IOException { final ByteArrayInputStream in = new ByteArrayInputStream(rawContent); String line; final List<NameValuePair> headersList = new LinkedList<>(); while ((line = IORoutines.readLine(in)) != null) { if ("".equals(line)) { break; } final int colonIdx = line.indexOf(':'); final String name = colonIdx == -1 ? "" : line.substring(0, colonIdx).trim().toLowerCase(); final String value = colonIdx == -1 ? line.trim() : line.substring(colonIdx + 1).trim(); headersList.add(new NameValuePair(name, value)); } // Note: This works with a ByteArrayInputStream. final int remainingLength = in.available(); final int offset = rawContent.length - remainingLength; final byte[] remainingContent = new byte[remainingLength]; System.arraycopy(rawContent, offset, remainingContent, 0, remainingLength); this.content = remainingContent; this.headers = headersList; this.expiration = expires; this.requestTime = requestTime; this.altObject = altObject; this.altObjectSize = altObjectSize; } }