/*
* Copyright 2012 The Netty Project
*
* The Netty Project licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package io.netty.handler.codec.http.multipart;
import io.netty.buffer.
ByteBuf;
import java.io.
File;
import java.io.
IOException;
import java.io.
InputStream;
import java.nio.charset.
Charset;
/**
* Mixed implementation using both in Memory and in File with a limit of size
*/
public class
MixedFileUpload implements
FileUpload {
private
FileUpload fileUpload;
private final long
limitSize;
private final long
definedSize;
private long
maxSize =
DefaultHttpDataFactory.
MAXSIZE;
public
MixedFileUpload(
String name,
String filename,
String contentType,
String contentTransferEncoding,
Charset charset, long
size,
long
limitSize) {
this.
limitSize =
limitSize;
if (
size > this.
limitSize) {
fileUpload = new
DiskFileUpload(
name,
filename,
contentType,
contentTransferEncoding,
charset,
size);
} else {
fileUpload = new
MemoryFileUpload(
name,
filename,
contentType,
contentTransferEncoding,
charset,
size);
}
definedSize =
size;
}
@
Override
public long
getMaxSize() {
return
maxSize;
}
@
Override
public void
setMaxSize(long
maxSize) {
this.
maxSize =
maxSize;
fileUpload.
setMaxSize(
maxSize);
}
@
Override
public void
checkSize(long
newSize) throws
IOException {
if (
maxSize >= 0 &&
newSize >
maxSize) {
throw new
IOException("Size exceed allowed maximum capacity");
}
}
@
Override
public void
addContent(
ByteBuf buffer, boolean
last)
throws
IOException {
if (
fileUpload instanceof
MemoryFileUpload) {
checkSize(
fileUpload.
length() +
buffer.
readableBytes());
if (
fileUpload.
length() +
buffer.
readableBytes() >
limitSize) {
DiskFileUpload diskFileUpload = new
DiskFileUpload(
fileUpload
.
getName(),
fileUpload.
getFilename(),
fileUpload
.
getContentType(),
fileUpload
.
getContentTransferEncoding(),
fileUpload.
getCharset(),
definedSize);
diskFileUpload.
setMaxSize(
maxSize);
ByteBuf data =
fileUpload.
getByteBuf();
if (
data != null &&
data.
isReadable()) {
diskFileUpload.
addContent(
data.
retain(), false);
}
// release old upload
fileUpload.
release();
fileUpload =
diskFileUpload;
}
}
fileUpload.
addContent(
buffer,
last);
}
@
Override
public void
delete() {
fileUpload.
delete();
}
@
Override
public byte[]
get() throws
IOException {
return
fileUpload.
get();
}
@
Override
public
ByteBuf getByteBuf() throws
IOException {
return
fileUpload.
getByteBuf();
}
@
Override
public
Charset getCharset() {
return
fileUpload.
getCharset();
}
@
Override
public
String getContentType() {
return
fileUpload.
getContentType();
}
@
Override
public
String getContentTransferEncoding() {
return
fileUpload.
getContentTransferEncoding();
}
@
Override
public
String getFilename() {
return
fileUpload.
getFilename();
}
@
Override
public
String getString() throws
IOException {
return
fileUpload.
getString();
}
@
Override
public
String getString(
Charset encoding) throws
IOException {
return
fileUpload.
getString(
encoding);
}
@
Override
public boolean
isCompleted() {
return
fileUpload.
isCompleted();
}
@
Override
public boolean
isInMemory() {
return
fileUpload.
isInMemory();
}
@
Override
public long
length() {
return
fileUpload.
length();
}
@
Override
public long
definedLength() {
return
fileUpload.
definedLength();
}
@
Override
public boolean
renameTo(
File dest) throws
IOException {
return
fileUpload.
renameTo(
dest);
}
@
Override
public void
setCharset(
Charset charset) {
fileUpload.
setCharset(
charset);
}
@
Override
public void
setContent(
ByteBuf buffer) throws
IOException {
checkSize(
buffer.
readableBytes());
if (
buffer.
readableBytes() >
limitSize) {
if (
fileUpload instanceof
MemoryFileUpload) {
FileUpload memoryUpload =
fileUpload;
// change to Disk
fileUpload = new
DiskFileUpload(
memoryUpload
.
getName(),
memoryUpload.
getFilename(),
memoryUpload
.
getContentType(),
memoryUpload
.
getContentTransferEncoding(),
memoryUpload.
getCharset(),
definedSize);
fileUpload.
setMaxSize(
maxSize);
// release old upload
memoryUpload.
release();
}
}
fileUpload.
setContent(
buffer);
}
@
Override
public void
setContent(
File file) throws
IOException {
checkSize(
file.
length());
if (
file.
length() >
limitSize) {
if (
fileUpload instanceof
MemoryFileUpload) {
FileUpload memoryUpload =
fileUpload;
// change to Disk
fileUpload = new
DiskFileUpload(
memoryUpload
.
getName(),
memoryUpload.
getFilename(),
memoryUpload
.
getContentType(),
memoryUpload
.
getContentTransferEncoding(),
memoryUpload.
getCharset(),
definedSize);
fileUpload.
setMaxSize(
maxSize);
// release old upload
memoryUpload.
release();
}
}
fileUpload.
setContent(
file);
}
@
Override
public void
setContent(
InputStream inputStream) throws
IOException {
if (
fileUpload instanceof
MemoryFileUpload) {
FileUpload memoryUpload =
fileUpload;
// change to Disk
fileUpload = new
DiskFileUpload(
fileUpload
.
getName(),
fileUpload.
getFilename(),
fileUpload
.
getContentType(),
fileUpload
.
getContentTransferEncoding(),
fileUpload.
getCharset(),
definedSize);
fileUpload.
setMaxSize(
maxSize);
// release old upload
memoryUpload.
release();
}
fileUpload.
setContent(
inputStream);
}
@
Override
public void
setContentType(
String contentType) {
fileUpload.
setContentType(
contentType);
}
@
Override
public void
setContentTransferEncoding(
String contentTransferEncoding) {
fileUpload.
setContentTransferEncoding(
contentTransferEncoding);
}
@
Override
public void
setFilename(
String filename) {
fileUpload.
setFilename(
filename);
}
@
Override
public
HttpDataType getHttpDataType() {
return
fileUpload.
getHttpDataType();
}
@
Override
public
String getName() {
return
fileUpload.
getName();
}
@
Override
public int
hashCode() {
return
fileUpload.
hashCode();
}
@
Override
public boolean
equals(
Object obj) {
return
fileUpload.
equals(
obj);
}
@
Override
public int
compareTo(
InterfaceHttpData o) {
return
fileUpload.
compareTo(
o);
}
@
Override
public
String toString() {
return "Mixed: " +
fileUpload;
}
@
Override
public
ByteBuf getChunk(int
length) throws
IOException {
return
fileUpload.
getChunk(
length);
}
@
Override
public
File getFile() throws
IOException {
return
fileUpload.
getFile();
}
@
Override
public
FileUpload copy() {
return
fileUpload.
copy();
}
@
Override
public
FileUpload duplicate() {
return
fileUpload.
duplicate();
}
@
Override
public
FileUpload retainedDuplicate() {
return
fileUpload.
retainedDuplicate();
}
@
Override
public
FileUpload replace(
ByteBuf content) {
return
fileUpload.
replace(
content);
}
@
Override
public
ByteBuf content() {
return
fileUpload.
content();
}
@
Override
public int
refCnt() {
return
fileUpload.
refCnt();
}
@
Override
public
FileUpload retain() {
fileUpload.
retain();
return this;
}
@
Override
public
FileUpload retain(int
increment) {
fileUpload.
retain(
increment);
return this;
}
@
Override
public
FileUpload touch() {
fileUpload.
touch();
return this;
}
@
Override
public
FileUpload touch(
Object hint) {
fileUpload.
touch(
hint);
return this;
}
@
Override
public boolean
release() {
return
fileUpload.
release();
}
@
Override
public boolean
release(int
decrement) {
return
fileUpload.
release(
decrement);
}
}