/*--- formatted by Jindent 2.1, (www.c-lab.de/~jindent) ---*/ /** * *************************************************************** * The LEAP libraries, when combined with certain JADE platform components, * provide a run-time environment for enabling FIPA agents to execute on * lightweight devices running Java. LEAP and JADE teams have jointly * designed the API for ease of integration and hence to take advantage * of these dual developments and extensions so that users only see * one development platform and a * single homogeneous set of APIs. Enabling deployment to a wide range of * devices whilst still having access to the full development * environment and functionalities that JADE provides. * Copyright (C) 2001 Telecom Italia LAB S.p.A. * Copyright (C) 2001 Motorola. * * GNU Lesser General Public License * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * ************************************************************** */ package jade.imtp.leap.http; //#MIDP_EXCLUDE_FILE import jade.core.CaseInsensitiveString; import java.io.*; import java.util.Hashtable; import java.util.Enumeration; /** * @author Giovanni Caire - TILAB */ public class HTTPPacket { private static final CaseInsensitiveString CONTENT_LENGTH_KEY = new CaseInsensitiveString("content-length"); private static final int CR = 13; private static final int LF = 10; private static final String DELIMITER = new String(new byte[]{CR, LF}); protected String firstLine = null; protected String httpType = null; protected Hashtable fields = new Hashtable(); protected byte[] payload = null; /** * Constructor declaration */ protected HTTPPacket() { } public String getHttpType() { return httpType; } public String getField(String key) { return (String) fields.get(new CaseInsensitiveString(key)); } public byte[] getPayload() { return payload; } public void setHttpType(String type) { httpType = type; } public void setField(String key, String value) { if (value != null) { fields.put(new CaseInsensitiveString(key), value); } else { fields.remove(new CaseInsensitiveString(key)); } } public void setPayload(byte[] p) { payload = p; if (payload != null) { fields.put(CONTENT_LENGTH_KEY, String.valueOf(payload.length)); } else { fields.remove(CONTENT_LENGTH_KEY); } } public void setPayload(byte[] bb, int first, int length) { payload = new byte[length]; System.arraycopy(bb, first, payload, 0, length); fields.put(CONTENT_LENGTH_KEY, String.valueOf(payload.length)); } /** * Method declaration * @see */ protected void readFrom(InputStream is) throws IOException { // Read bytes until the payload marker (13-10-13-10) into a temporary buffer ByteArrayOutputStream baos = new ByteArrayOutputStream(); int[] bb = new int[]{0, 0, 0}; int pos = 0; //System.out.println("HTTP packet header -----------"); do { bb[pos] = is.read(); //System.out.print(bb[pos]+" "); if (bb[pos] == -1) { throw new EOFException("Unexpected EOF"); } baos.write(bb[pos++]); if (pos >= 3) { pos = 0; } } while (!endOfHeader(bb, pos)); //System.out.println("\n------------------------------"); // Parse the Header from the temporary buffer ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); BufferedReader inpReader = new BufferedReader(new InputStreamReader(bais)); firstLine = inpReader.readLine(); //System.out.println(firstLine); while (true) { String line = inpReader.readLine(); //System.out.println(line); if (line == null || line.length() == 0) { // Header completed //System.out.println("------------------------------"); break; } try { int colonIndex = line.indexOf(':'); String key = line.substring(0, colonIndex); String value = (line.substring(colonIndex + 1, line.length())).trim(); setField(key, value); } catch (Exception e) { throw new IOException("Header field format error. " + e); } } // Get the payload Payload try { int length = Integer.parseInt((String) fields.get(CONTENT_LENGTH_KEY)); //System.out.println("Reading "+length+" bytes..."); payload = new byte[length]; int n = 0; while (n < length) { int k = is.read(payload, n, length - n); if (k < 0) { throw new EOFException(String.valueOf(n)); } n += k; } //System.out.println("Done"); } catch (IOException ioe) { // Rethrow the exception throw ioe; } catch (Exception e) { payload = null; } } private static final boolean endOfHeader(int[] bb, int pos) { if (bb[pos] == LF) { if ((++pos) >= 3) { pos = 0; } if (bb[pos] == CR) { if ((++pos) >= 3) { pos = 0; } return bb[pos] == LF; } } return false; } /** * Method declaration * @see */ protected void writeTo(OutputStream os) throws IOException { // Write the Header into a temporary buffer ByteArrayOutputStream baos = new ByteArrayOutputStream(); BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(baos)); outWriter.write(firstLine); outWriter.write(DELIMITER); Enumeration e = fields.keys(); while (e.hasMoreElements()) { CaseInsensitiveString key = (CaseInsensitiveString) e.nextElement(); String value = (String) fields.get(key); outWriter.write(key.toString() + ": " + value); outWriter.write(DELIMITER); } outWriter.write(DELIMITER); outWriter.flush(); // Payload if (payload != null) { baos.write(payload); } os.write(baos.toByteArray()); os.flush(); } /** * Method declaration * @see */ public String toString() { StringBuffer sb = new StringBuffer(); Enumeration e = fields.keys(); while (e.hasMoreElements()) { CaseInsensitiveString key = (CaseInsensitiveString) e.nextElement(); String value = (String) fields.get(key); sb.append(key.toString() + "=" + value); sb.append("\n"); } if (payload != null) { sb.append("-------------\nPayload size: " + payload.length + "\n"); } return sb.toString(); } }