Package jade.imtp.leap.http

Source Code of jade.imtp.leap.http.HTTPPacket

/*--- 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();
    }
}

TOP

Related Classes of jade.imtp.leap.http.HTTPPacket

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.