Exemple #1
0
 @Override
 public void addContent(ChannelBuffer buffer, boolean last) throws IOException {
   if (fileUpload instanceof MemoryFileUpload) {
     if (fileUpload.length() + buffer.readableBytes() > limitSize) {
       DiskFileUpload diskFileUpload =
           new DiskFileUpload(
               fileUpload.getName(),
               fileUpload.getFilename(),
               fileUpload.getContentType(),
               fileUpload.getContentTransferEncoding(),
               fileUpload.getCharset(),
               definedSize);
       if (((MemoryFileUpload) fileUpload).getChannelBuffer() != null) {
         diskFileUpload.addContent(((MemoryFileUpload) fileUpload).getChannelBuffer(), last);
       }
       fileUpload = diskFileUpload;
     }
   }
   fileUpload.addContent(buffer, last);
 }
 /**
  * Read a FileUpload data as Byte (Binary) and add the bytes directly to the FileUpload. If the
  * delimiter is found, the FileUpload is completed.
  *
  * @param delimiter
  * @throws NotEnoughDataDecoderException Need more chunks but do not reset the readerInder since
  *     some values will be already added to the FileOutput
  * @throws ErrorDataDecoderException write IO error occurs with the FileUpload
  */
 private void readFileUploadByteMultipart(String delimiter)
     throws NotEnoughDataDecoderException, ErrorDataDecoderException {
   int readerIndex = undecodedChunk.readerIndex();
   // found the decoder limit
   boolean newLine = true;
   int index = 0;
   int lastPosition = undecodedChunk.readerIndex();
   boolean found = false;
   while (undecodedChunk.readable()) {
     byte nextByte = undecodedChunk.readByte();
     if (newLine) {
       // Check the delimiter
       if (nextByte == delimiter.codePointAt(index)) {
         index++;
         if (delimiter.length() == index) {
           found = true;
           break;
         }
         continue;
       } else {
         newLine = false;
         index = 0;
         // continue until end of line
         if (nextByte == HttpCodecUtil.CR) {
           if (undecodedChunk.readable()) {
             nextByte = undecodedChunk.readByte();
             if (nextByte == HttpCodecUtil.LF) {
               newLine = true;
               index = 0;
               lastPosition = undecodedChunk.readerIndex() - 2;
             }
           }
         } else if (nextByte == HttpCodecUtil.LF) {
           newLine = true;
           index = 0;
           lastPosition = undecodedChunk.readerIndex() - 1;
         } else {
           // save last valid position
           lastPosition = undecodedChunk.readerIndex();
         }
       }
     } else {
       // continue until end of line
       if (nextByte == HttpCodecUtil.CR) {
         if (undecodedChunk.readable()) {
           nextByte = undecodedChunk.readByte();
           if (nextByte == HttpCodecUtil.LF) {
             newLine = true;
             index = 0;
             lastPosition = undecodedChunk.readerIndex() - 2;
           }
         }
       } else if (nextByte == HttpCodecUtil.LF) {
         newLine = true;
         index = 0;
         lastPosition = undecodedChunk.readerIndex() - 1;
       } else {
         // save last valid position
         lastPosition = undecodedChunk.readerIndex();
       }
     }
   }
   ChannelBuffer buffer = undecodedChunk.slice(readerIndex, lastPosition - readerIndex);
   if (found) {
     // found so lastPosition is correct and final
     try {
       currentFileUpload.addContent(buffer, true);
       // just before the CRLF and delimiter
       undecodedChunk.readerIndex(lastPosition);
     } catch (IOException e) {
       throw new ErrorDataDecoderException(e);
     }
   } else {
     // possibly the delimiter is partially found but still the last position is OK
     try {
       currentFileUpload.addContent(buffer, false);
       // last valid char (not CR, not LF, not beginning of delimiter)
       undecodedChunk.readerIndex(lastPosition);
       throw new NotEnoughDataDecoderException();
     } catch (IOException e) {
       throw new ErrorDataDecoderException(e);
     }
   }
 }