/* 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 verion 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 */ /* * Created on Jun 12, 2005 */ package org.lobobrowser.request; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.lobobrowser.util.NameValuePair; import org.lobobrowser.util.io.IORoutines; /** * @author J. H. S. */ public class FileWithHeadersURLConnection extends HttpURLConnection { private final byte[] content; private InputStream inputStream; private final Map<String, List<String>> headersMap = new HashMap<>(); private final List<NameValuePair> headersList = new ArrayList<>(); /** * @param url */ public FileWithHeadersURLConnection(final URL url, final byte[] content) { super(url); this.content = content; } @Override public void disconnect() { if (this.connected) { final InputStream in = this.inputStream; if (in != null) { try { in.close(); } catch (final IOException ioe) { // ignore } } } } /* * (non-Javadoc) * * @see java.net.URLConnection#connect() */ @Override public void connect() throws IOException { if (!this.connected) { final InputStream in = new ByteArrayInputStream(this.content); try { this.inputStream = in; readHeaders(in); } finally { // Do not close inputStream. Needed later. this.connected = true; this.responseCode = 200; } } } private void readHeaders(final InputStream in) throws IOException { String line; final List<NameValuePair> headersList = this.headersList; final Map<String, List<String>> headersMap = this.headersMap; 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(); List<String> hvalues = headersMap.get(name); if (hvalues == null) { hvalues = new ArrayList<>(1); headersMap.put(name, hvalues); } hvalues.add(value); headersList.add(new NameValuePair(name, value)); } } /* * (non-Javadoc) * * @see java.net.URLConnection#getInputStream() */ @Override public InputStream getInputStream() throws IOException { this.connect(); return this.inputStream; } /* * (non-Javadoc) * * @see java.net.URLConnection#getHeaderField(int) */ @Override public String getHeaderField(final int n) { try { this.connect(); final NameValuePair pair = this.headersList.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.headersList.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 boolean usingProxy() { return false; } }