[ 
https://issues.apache.org/activemq/browse/CAMEL-2551?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen resolved CAMEL-2551.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 2.3.0

> 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
>            Assignee: Willem Jiang
>             Fix For: 2.3.0
>
>         Attachments: patch.txt
>
>
> 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