Example usage for org.apache.commons.httpclient ChunkedInputStream read

List of usage examples for org.apache.commons.httpclient ChunkedInputStream read

Introduction

In this page you can find the example usage for org.apache.commons.httpclient ChunkedInputStream read.

Prototype

public int read(byte[] paramArrayOfByte, int paramInt1, int paramInt2) throws IOException 

Source Link

Usage

From source file:org.mule.providers.http.HttpMessageReceiver.java

protected Object parseRequest(InputStream is, Properties p) throws IOException {
    RequestInputStream req = new RequestInputStream(is);
    Object payload = null;//  w w w . ja va2  s.c  o m
    String startLine = null;
    do {
        try {
            startLine = req.readline();
        } catch (IOException e) {
            logger.debug(e.getMessage());
        }
        if (startLine == null)
            return null;
    } while (startLine.trim().length() == 0);

    StringTokenizer tokenizer = new StringTokenizer(startLine);
    String method = tokenizer.nextToken();
    String request = tokenizer.nextToken();
    String httpVersion = tokenizer.nextToken();

    p.setProperty(HttpConnector.HTTP_METHOD_PROPERTY, method);
    p.setProperty(HttpConnector.HTTP_REQUEST_PROPERTY, request);
    p.setProperty(HttpConnector.HTTP_VERSION_PROPERTY, httpVersion);

    // Read headers from the request as set them as properties on the event
    readHeaders(req, p);

    if (method.equals(HttpConstants.METHOD_GET)) {
        payload = request.getBytes();
    } else {
        boolean multipart = p.getProperty(HttpConstants.HEADER_CONTENT_TYPE, "")
                .indexOf("multipart/related") > -1;
        String contentLengthHeader = p.getProperty(HttpConstants.HEADER_CONTENT_LENGTH, null);
        String chunkedString = PropertiesHelper.getStringProperty(p, HttpConstants.HEADER_TRANSFER_ENCODING,
                null);
        boolean chunked = "chunked".equalsIgnoreCase(chunkedString);
        if (contentLengthHeader == null && !chunked) {
            throw new IllegalStateException(HttpConstants.HEADER_CONTENT_LENGTH + " header must be set");
        }

        if (chunked) {
            byte[] buffer = new byte[1024 * 32];
            int totalLength = 0;
            int length = 0;
            ChunkedInputStream cis = new ChunkedInputStream(req);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //ast: change the chunked method to avoid original mule limitation of 32768 bytes
            do {
                length = cis.read(buffer, 0, buffer.length);
                if (length >= 0) {
                    baos.write(buffer, 0, length);
                    totalLength += length;
                }
            } while (length >= 0);

            if ((length == -1) && (totalLength == 0)) {
                return null;
            }

            payload = baos.toByteArray();
        } else {
            int contentLength = Integer.parseInt(contentLengthHeader);

            if (multipart) {
                byte[] buffer = new byte[1024];

                payload = File.createTempFile("mime", ".att");
                ((File) payload).deleteOnExit();
                FileOutputStream os = new FileOutputStream((File) payload);

                int length = -1;
                int offset = 0;
                while (offset != contentLength) {
                    buffer = new byte[1024];
                    length = is.read(buffer);
                    if (length != -1) {
                        os.write(buffer, 0, length);
                        offset += length;
                    }
                }
                os.close();
            } else {
                byte[] buffer = new byte[contentLength];

                int length = -1;
                int offset = req.read(buffer);
                while (offset >= 0 && offset < buffer.length) {
                    length = req.read(buffer, offset, buffer.length - offset);
                    if (length == -1) {
                        break;
                    }
                    offset += length;
                }
                payload = buffer;
            }
        }
    }
    return payload;
}