File component does not correctly handle PipedInputStream in message body.
--------------------------------------------------------------------------

                 Key: CAMEL-2551
                 URL: https://issues.apache.org/activemq/browse/CAMEL-2551
             Project: Apache Camel
          Issue Type: Bug
          Components: camel-core
    Affects Versions: 2.2.0
         Environment: does not matter
            Reporter: Sergey Zolotaryov


Streams that do not have their contents length at immediate disposal, like 
PipedInputStream, are not processed correctly by the file component.

\\

{code}
    private void writeFileByStream(InputStream in, File target) throws 
IOException {
        FileChannel out = null;
        try {
            out = prepareOutputFileChannel(target, out);

            if (LOG.isTraceEnabled()) {
                LOG.trace("Using InputStream to transfer from: " + in + " to: " 
+ out);
            }
            int size = endpoint.getBufferSize();
            byte[] buffer = new byte[size];
            ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
            while (true) {
                int count = in.read(buffer);
                if (count <= 0) {
                    break;
                } else if (count < size) {
                    byteBuffer = ByteBuffer.wrap(buffer, 0, count);
                    out.write(byteBuffer);
                    break;
                } else {
                    out.write(byteBuffer);
                    byteBuffer.clear();
                }
            }
        } finally {
            ObjectHelper.close(in, target.getName(), LOG);
            ObjectHelper.close(out, target.getName(), LOG);
        }
    }

{code}

The code 

{code}
                } else if (count < size) {
                    byteBuffer = ByteBuffer.wrap(buffer, 0, count);
                    out.write(byteBuffer);
                    break;
                } else {
{code}

does not take into account that bytes read can be less than the size of the 
buffer passed into the InputStream.read method and stream can still have more 
content. The only indication that EOF was reached is -1 returned from the read 
method according to Java API.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to