|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.turbine.util.upload.MultipartStream
This class can be used to process data streams conforming to MIME 'multipart' format as defined in RFC 1251. Arbitrary large amouns of data in the stream can be processed under constant memory usage.
The format of the stream is defined in the following way:
multipart-body := preamble 1*encapsulation close-delimiter epilogue
encapsulation := delimiter body CRLF
delimiter := "--" boundary CRLF
close-delimiter := "--" boudary "--"
preamble := <ignore>
epilogue := <ignore>
body := header-part CRLF body-part
header-part := 1*header CRLF
header := header-name ":" header-value
header-name := <printable ascii characters except ":">
header-value := <any ascii characters except CR & LF>
body-data := <arbitrary data>
Note that body-data can contain another mulipart entity. There
is limited support for single pass processing of such nested
streams. The nested stream is required to have a
boundary token of the same length as the parent stream (see setBoundary(byte[])
).
Here is an exaple of usage of this class.
try { MultipartStream multipartStream = new MultipartStream(input, boundary); boolean nextPart = malitPartStream.skipPreamble(); OutputStream output; while(nextPart) { header = chunks.readHeader(); // process headers // create some output stream multipartStream.readBodyPart(output); nextPart = multipartStream.readBoundary(); } } catch(MultipartStream.MalformedStreamException e) { // the stream failed to follow required syntax } catch(IOException) { // a read or write error occurred }
Nested Class Summary | |
class |
MultipartStream.IllegalBoundaryException
Deprecated. Thrown upon attempt of setting an invalid boundary token. |
class |
MultipartStream.MalformedStreamException
Deprecated. Thrown to indicate that the input stream fails to follow the required syntax. |
Field Summary | |
protected byte[] |
boundary
Deprecated. A byte sequence that partitions the stream. |
protected int |
boundaryLength
Deprecated. The lenght of boundary token plus leading CRLF-- . |
protected byte[] |
buffer
Deprecated. The buffer used for processing. |
protected int |
bufSize
Deprecated. The lenght of the buffer used for processing. |
protected static int |
DEFAULT_BUFSIZE
Deprecated. The default lenght of the buffer used for processing. |
protected static byte[] |
FIELD_SEPARATOR
Deprecated. A byte sequence that that follows a delimiter that will be followed by an encapsulation ( CRLF ). |
protected int |
head
Deprecated. The index of first valid character in the buffer. |
static int |
HEADER_PART_SIZE_MAX
Deprecated. The maximum lenght of header-part that will be
processed (10 kilobytes = 10240 bytes.) |
protected static byte[] |
HEADER_SEPARATOR
Deprecated. A byte sequence that marks the end of header-part
(CRLFCRLF ). |
protected java.io.InputStream |
input
Deprecated. The stream were data is read from. |
protected int |
keepRegion
Deprecated. The amount of data that must be kept in the buffer in order to detect delimiters reliably. |
protected static byte[] |
STREAM_TERMINATOR
Deprecated. A byte sequence that that follows a delimiter of the last encapsulation in the stream ( -- ). |
protected int |
tail
Deprecated. The index of last valid characer in the buffer + 1. |
Constructor Summary | |
MultipartStream(java.io.InputStream input,
byte[] boundary)
Deprecated. Constructs a MultipartStream with a defalut size buffer. |
|
MultipartStream(java.io.InputStream input,
byte[] boundary,
int bufSize)
Deprecated. Constructs a MultipartStream with a custom size buffer. |
Method Summary | |
static boolean |
arrayequals(byte[] a,
byte[] b,
int count)
Deprecated. Compares count first bytes in the arrays
a and b . |
int |
discardBodyData()
Deprecated. Reads body-data from the current
encapsulation and discards it. |
protected int |
findByte(byte value,
int pos)
Deprecated. Searches a byte of specified value in the buffer
starting at specified position . |
protected int |
findSeparator()
Deprecated. Searches the boundary in buffer
region delimited by head and tail . |
int |
readBodyData(java.io.OutputStream output)
Deprecated. Reads body-data from the current
encapsulation and writes its contents into the
output Stream . |
boolean |
readBoundary()
Deprecated. Skips a boundary token, and checks wether more
encapsulations are contained in the stream. |
byte |
readByte()
Deprecated. Reads a byte from the buffer , and refills it as
neccessary. |
java.lang.String |
readHeaders()
Deprecated. Reads header-part of the current
encapsulation
|
void |
setBoundary(byte[] boundary)
Deprecated. Changes the boundary token used for partitioning the stream. |
boolean |
skipPreamble()
Deprecated. Finds the beginning of the first encapsulation . |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
public static final int HEADER_PART_SIZE_MAX
header-part
that will be
processed (10 kilobytes = 10240 bytes.)
protected java.io.InputStream input
protected int boundaryLength
CRLF--
.
protected int keepRegion
protected byte[] boundary
protected int bufSize
protected static final int DEFAULT_BUFSIZE
protected byte[] buffer
protected int head
protected int tail
protected static final byte[] HEADER_SEPARATOR
header-part
(CRLFCRLF
).
protected static final byte[] FIELD_SEPARATOR
CRLF
).
protected static final byte[] STREAM_TERMINATOR
--
).
Constructor Detail |
public MultipartStream(java.io.InputStream input, byte[] boundary, int bufSize) throws MultipartStream.MalformedStreamException, java.io.IOException
Note that the buffer must be at least big enough to contain the boundary string, plus 4 characters for CR/LF and double dash, plus at least one byte of data. Too small buffer size setting will degrade performance.
input
- The InputStream
to serve as a data
source.boundary
- The token used for dividing the stream into
encapsulations
.bufSize
- The size of the buffer to be used in bytes.
MalformedStreamException.
IOException.
MultipartStream.MalformedStreamException
java.io.IOException
public MultipartStream(java.io.InputStream input, byte[] boundary) throws java.io.IOException
input
- The InputStream
to serve as a data
source.boundary
- The token used for dividing the stream into
encapsulations
.
IOException.
java.io.IOException
Method Detail |
public byte readByte() throws java.io.IOException
buffer
, and refills it as
neccessary.
IOException,
- if there isn't any more data available.
java.io.IOException
public boolean readBoundary() throws MultipartStream.MalformedStreamException
boundary
token, and checks wether more
encapsulations
are contained in the stream.
True
if there are more encapsulations in
this stream.
MultipartStream.MalformedStreamException
- if the stream ends
unexpecetedly or fails to follow required syntax.public void setBoundary(byte[] boundary) throws MultipartStream.IllegalBoundaryException
This method allows single pass processing of nested multipart streams.
The boundary token of the nested stream is
required
to be of the same length as the boundary
token in parent stream.
Restoring parent stream boundary token after processing of a
nested stream is left ot the application.
boundary
- A boundary to be used for parsing of the nested
stream.
IllegalBoundaryException,
- if boundary
has diffrent lenght than the one being currently in use.
MultipartStream.IllegalBoundaryException
public java.lang.String readHeaders() throws MultipartStream.MalformedStreamException
Reads header-part
of the current
encapsulation
Headers are returned verbatim to the input stream, including
traling CRLF
marker. Parsing is left to the
application.
TODO allow limiting maximum header size to
protect against abuse.
header-part
of the current encapsulation.
MalformedStreamException,
- if the stream ends
unexpecetedly.
MultipartStream.MalformedStreamException
public int readBodyData(java.io.OutputStream output) throws MultipartStream.MalformedStreamException, java.io.IOException
body-data
from the current
encapsulation
and writes its contents into the
output Stream
.
Arbitrary large amouts of data can be processed by this
method using a constant size buffer. (see constructor
).
output
- The Stream
to write data into.
MultipartStream.MalformedStreamException
java.io.IOException
public int discardBodyData() throws MultipartStream.MalformedStreamException, java.io.IOException
body-data
from the current
encapsulation
and discards it.
Use this method to skip encapsulations you don't need or don't understand.
MultipartStream.MalformedStreamException
java.io.IOException
public boolean skipPreamble() throws java.io.IOException
encapsulation
.
True
if an encapsulation
was
found in the stream.
java.io.IOException
public static boolean arrayequals(byte[] a, byte[] b, int count)
count
first bytes in the arrays
a
and b
.
a
- The first array to compare.b
- The second array to compare.count
- How many bytes should be compared.
true
if count
first bytes in
arrays a
and b
are equal.protected int findByte(byte value, int pos)
buffer
starting at specified position
.
value
- the value to find.pos
- The starting position for searching.
buffer
, or -1
if not found.protected int findSeparator()
boundary
in buffer
region delimited by head
and tail
.
buffer
, or -1
if not
found.
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |