/*
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.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.lobobrowser.util.NameValuePair;
public class MemoryURLConnection extends URLConnection {
private final MemoryCacheEntry memoryEntry;
public MemoryURLConnection(final URL url, final MemoryCacheEntry memoryEntry) {
super(url);
this.memoryEntry = memoryEntry;
}
private InputStream inputStream;
private final Map<String, List<String>> headersMap = new HashMap<>();
@Override
public void connect() throws IOException {
if (!this.connected) {
this.readHeaders();
final InputStream in = new ByteArrayInputStream(this.memoryEntry.content);
this.inputStream = in;
this.connected = true;
}
}
private void readHeaders() throws IOException {
final Map<String, List<String>> headersMap = this.headersMap;
final List<NameValuePair> origList = this.memoryEntry.headers;
final Iterator<NameValuePair> i = origList.iterator();
while (i.hasNext()) {
final NameValuePair pair = i.next();
String name = pair.name;
if (name != null) {
name = name.toLowerCase();
}
final String value = pair.value;
List<String> hvalues = headersMap.get(name);
if (hvalues == null) {
hvalues = new ArrayList<>(1);
headersMap.put(name, hvalues);
}
hvalues.add(value);
}
}
/*
* (non-Javadoc)
*
* @see java.net.URLConnection#getHeaderField(int)
*/
@Override
public String getHeaderField(final int n) {
try {
this.connect();
final NameValuePair pair = this.memoryEntry.headers.get(n);
return pair.value;
} catch (final IndexOutOfBoundsException iob) {
return null;
} catch (final IOException ioe) {
return null;
}
}
/*
* (non-Javadoc)
*
* @see java.net.URLConnection#getHeaderField(java.lang.String)
*/
@Override
public String getHeaderField(final String name) {
try {
this.connect();
} catch (final IOException ioe) {
return null;
}
final List<String> hvalues = this.headersMap.get(name.toLowerCase());
if ((hvalues == null) || (hvalues.size() == 0)) {
return null;
}
return hvalues.get(0);
}
/*
* (non-Javadoc)
*
* @see java.net.URLConnection#getHeaderFieldKey(int)
*/
@Override
public String getHeaderFieldKey(final int n) {
try {
this.connect();
final NameValuePair pair = this.memoryEntry.headers.get(n);
return pair.name;
} catch (final IndexOutOfBoundsException iob) {
return null;
} catch (final IOException ioe) {
return null;
}
}
/*
* (non-Javadoc)
*
* @see java.net.URLConnection#getHeaderFields()
*/
@Override
public Map<String, List<String>> getHeaderFields() {
try {
this.connect();
} catch (final IOException ioe) {
return null;
}
return this.headersMap;
}
@Override
public InputStream getInputStream() throws IOException {
this.connect();
return this.inputStream;
}
}