public class MultipartStream2 extends Object
multipart-body := preamble 1*encapsulation close-delimiter epilogue
encapsulation := delimiter body CRLF
delimiter := "--" boundary CRLF
close-delimiter := "--" boundary "--"
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>
setBoundary(byte[])).
try { MultipartStream multipartStream = new MultipartStream(input, boundary);
boolean nextPart = multipartStream.skipPreamble(); OutputStream output;
while(nextPart) { String header = multipartStream.readHeaders(); // process
headers // create some output stream multipartStream.readBodyData(output);
nextPart = multipartStream.readBoundary(); } }
catch(MultipartStream.MalformedStreamException e) { // the stream failed to
follow required syntax } catch(IOException e) { // a skip or write error
occurred }
| Modifier and Type | Class and Description |
|---|---|
static class |
MultipartStream2.IllegalBoundaryException
Thrown upon attempt of setting an invalid boundary token.
|
class |
MultipartStream2.ItemInputStream
An
InputStream for reading an items contents. |
static class |
MultipartStream2.MalformedStreamException
Thrown to indicate that the input stream fails to follow the required
syntax.
|
static interface |
MultipartStream2.ProgressListener |
static class |
MultipartStream2.ProgressNotifier
Internal class, which is used to invoke the
MultipartStream2.ProgressListener. |
| Modifier and Type | Field and Description |
|---|---|
protected static byte[] |
BOUNDARY_PREFIX
A byte sequence that precedes a boundary (
CRLF--). |
static byte |
CR
The Carriage Return ASCII character value.
|
static byte |
DASH
The dash (-) ASCII character value.
|
protected static int |
DEFAULT_BUFSIZE
The default length of the buffer used for processing a request.
|
protected static byte[] |
FIELD_SEPARATOR
A byte sequence that that follows a delimiter that will be followed by an
encapsulation (
CRLF). |
static int |
HEADER_PART_SIZE_MAX
The maximum length of
header-part that will be processed (10
kilobytes = 10240 bytes.). |
protected static byte[] |
HEADER_SEPARATOR
A byte sequence that marks the end of
header-part
(CRLFCRLF). |
static byte |
LF
The Line Feed ASCII character value.
|
protected static byte[] |
STREAM_TERMINATOR
A byte sequence that that follows a delimiter of the last encapsulation
in the stream (
--). |
| Constructor and Description |
|---|
MultipartStream2(InputStream input,
byte[] boundary,
int bufSize,
MultipartStream2.ProgressNotifier pNotifier,
net.thevpc.nuts.NutsSession session)
Constructs a MultipartStream with a custom size buffer. |
| Modifier and Type | Method and Description |
|---|---|
static boolean |
arrayequals(byte[] a,
byte[] b,
int count)
Compares
count first bytes in the arrays a and
b. |
int |
discardBodyData()
Reads body-data from the current encapsulation
and discards it. |
protected int |
findByte(byte value,
int pos)
Searches for a byte of specified value in the
buffer,
starting at the specified position. |
protected int |
findSeparator()
Searches for the
boundary in the buffer region
delimited by head and tail. |
String |
getHeaderEncoding()
Retrieves the character encoding used when reading the headers of an
individual part.
|
int |
readBodyData(OutputStream output)
Reads body-data from the current encapsulation
and writes its contents into the output Stream. |
boolean |
readBoundary()
Skips a
boundary token, and checks whether more
encapsulations are contained in the stream. |
byte |
readByte()
Reads a byte from the
buffer, and refills it as necessary. |
String |
readHeaders()
Reads the header-part of the current
encapsulation. |
void |
setBoundary(byte[] boundary)
Changes the boundary token used for partitioning the stream. |
void |
setHeaderEncoding(String encoding)
Specifies the character encoding to be used when reading the headers of
individual parts.
|
boolean |
skipPreamble()
Finds the beginning of the first
encapsulation. |
public static final byte CR
public static final byte LF
public static final byte DASH
public static final int HEADER_PART_SIZE_MAX
header-part that will be processed (10
kilobytes = 10240 bytes.).protected static final int DEFAULT_BUFSIZE
protected static final byte[] HEADER_SEPARATOR
header-part
(CRLFCRLF).protected static final byte[] FIELD_SEPARATOR
CRLF).protected static final byte[] STREAM_TERMINATOR
--).protected static final byte[] BOUNDARY_PREFIX
CRLF--).public MultipartStream2(InputStream input, byte[] boundary, int bufSize, MultipartStream2.ProgressNotifier pNotifier, net.thevpc.nuts.NutsSession session)
MultipartStream with a custom size buffer.
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.pNotifier - The notifier, which is used for calling the progress
listener, if any.session - sessionIllegalArgumentException - If the buffer size is too smallpublic String getHeaderEncoding()
null, the platform
default encoding is used.public void setHeaderEncoding(String encoding)
null, the platform
default encoding is used.encoding - The encoding used to skip part headers.public byte readByte()
throws IOException
buffer, and refills it as necessary.IOException - if there is no more data available.public boolean readBoundary()
throws net.thevpc.nuts.toolbox.nutsserver.util.MultipartStream2.FileUploadIOException,
MultipartStream2.MalformedStreamException
boundary token, and checks whether more
encapsulations are contained in the stream.true if there are more encapsulations in this
stream; false otherwise.FileUploadIOException - if the bytes skip from the stream exceeded
the size limitsMultipartStream2.MalformedStreamException - if the stream ends unexpectedly or fails
to follow required syntax.net.thevpc.nuts.toolbox.nutsserver.util.MultipartStream2.FileUploadIOExceptionpublic void setBoundary(byte[] boundary)
throws MultipartStream2.IllegalBoundaryException
required to be of
the same length as the boundary token in parent stream.
boundary - The boundary to be used for parsing of the nested stream.MultipartStream2.IllegalBoundaryException - if the boundary has a
different length than the one being currently parsed.public String readHeaders() throws net.thevpc.nuts.toolbox.nutsserver.util.MultipartStream2.FileUploadIOException, MultipartStream2.MalformedStreamException
header-part of the current
encapsulation.
CRLF marker. Parsing is left to the application.
header-part of the current encapsulation.FileUploadIOException - if the bytes skip from the stream exceeded
the size limits.MultipartStream2.MalformedStreamException - if the stream ends unexpectedly.net.thevpc.nuts.toolbox.nutsserver.util.MultipartStream2.FileUploadIOExceptionpublic int readBodyData(OutputStream output) throws MultipartStream2.MalformedStreamException, IOException
body-data from the current encapsulation
and writes its contents into the output Stream.
constructor).output - The Stream to write data into. May be null, in
which case this method is equivalent to discardBodyData().MultipartStream2.MalformedStreamException - if the stream ends unexpectedly.IOException - if an i/o error occurs.public int discardBodyData()
throws MultipartStream2.MalformedStreamException,
IOException
body-data from the current encapsulation
and discards it.
MultipartStream2.MalformedStreamException - if the stream ends unexpectedly.IOException - if an i/o error occurs.public boolean skipPreamble()
throws IOException
encapsulation.true if an encapsulation was found in
the stream.IOException - if an i/o error occurs.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 the specified position.value - The value to find.pos - The starting position for searching.buffer, or -1 if not found.protected int findSeparator()
boundary in the buffer region
delimited by head and tail.buffer, or -1 if not found.Copyright © 2021 vpc open source initiative. All rights reserved.