org.apache.http.io
Class ChunkedOutputStream

java.lang.Object
  extended by java.io.OutputStream
      extended by org.apache.http.io.ChunkedOutputStream
All Implemented Interfaces:
java.io.Closeable, java.io.Flushable

public class ChunkedOutputStream
extends java.io.OutputStream

This class implements chunked transfer coding as described in the Section 3.6.1 of RFC 2616. Writes are buffered to an internal buffer (2048 default size). Chunks are guaranteed to be at least as large as the buffer size (except for the last chunk).

3.6.1 Chunked Transfer Coding

The chunked encoding modifies the body of a message in order to transfer it as a series of chunks, each with its own size indicator, followed by an OPTIONAL trailer containing entity-header fields. This allows dynamically produced content to be transferred along with the information necessary for the recipient to verify that it has received the full message.

  Chunked-Body   = *chunk
                   last-chunk
                   trailer
                   CRLF

  chunk          = chunk-size [ chunk-extension ] CRLF
                   chunk-data CRLF
  chunk-size     = 1*HEX
  last-chunk     = 1*("0") [ chunk-extension ] CRLF

  chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
  chunk-ext-name = token
  chunk-ext-val  = token | quoted-string
  chunk-data     = chunk-size(OCTET)
  trailer        = *(entity-header CRLF)
 

The chunk-size field is a string of hex digits indicating the size of the chunk. The chunked encoding is ended by any chunk whose size is zero, followed by the trailer, which is terminated by an empty line.

The trailer allows the sender to include additional HTTP header fields at the end of the message. The Trailer header field can be used to indicate which header fields are included in a trailer (see section 14.40).

A server using chunked transfer-coding in a response MUST NOT use the trailer for any header fields unless at least one of the following is true:

a)the request included a TE header field that indicates "trailers" is acceptable in the transfer-coding of the response, as described in section 14.39; or,

b)the server is the origin server for the response, the trailer fields consist entirely of optional metadata, and the recipient could use the message (in a manner acceptable to the origin server) without receiving this metadata. In other words, the origin server is willing to accept the possibility that the trailer fields might be silently discarded along the path to the client.

This requirement prevents an interoperability failure when the message is being received by an HTTP/1.1 (or later) proxy and forwarded to an HTTP/1.0 recipient. It avoids a situation where compliance with the protocol would have necessitated a possibly infinite buffer on the proxy.

Author:
Mohammad Rezaei, Goldman, Sachs & Co., Oleg Kalnichevski

Constructor Summary
ChunkedOutputStream(HttpDataTransmitter datatransmitter)
          Wraps a data transmitter and chunks the output.
ChunkedOutputStream(HttpDataTransmitter out, int bufferSize)
          Wraps a stream and chunks the output.
 
Method Summary
 void close()
          Finishes writing to the underlying stream, but does NOT close the underlying stream.
 void finish()
          Must be called to ensure the internal cache is flushed and the closing chunk is written.
 void flush()
          Flushes the underlying stream, but leaves the internal buffer alone.
protected  void flushCache()
          Writes the cache out onto the underlying stream
protected  void flushCacheWithAppend(byte[] bufferToAppend, int off, int len)
          Writes the cache and bufferToAppend to the underlying stream as one large chunk
 void write(byte[] b)
          Writes the array.
 void write(byte[] src, int off, int len)
           
 void write(int b)
           
protected  void writeClosingChunk()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ChunkedOutputStream

public ChunkedOutputStream(HttpDataTransmitter out,
                           int bufferSize)
                    throws java.io.IOException
Wraps a stream and chunks the output.

Parameters:
out - the transmitter to wrap
bufferSize - minimum chunk size (excluding last chunk)
Throws:
java.io.IOException
Since:
3.0

ChunkedOutputStream

public ChunkedOutputStream(HttpDataTransmitter datatransmitter)
                    throws java.io.IOException
Wraps a data transmitter and chunks the output. The default buffer size of 2048 was chosen because the chunk overhead is less than 0.5%

Parameters:
datatransmitter - the transmitter to wrap
Throws:
java.io.IOException
Method Detail

flushCache

protected void flushCache()
                   throws java.io.IOException
Writes the cache out onto the underlying stream

Throws:
java.io.IOException
Since:
3.0

flushCacheWithAppend

protected void flushCacheWithAppend(byte[] bufferToAppend,
                                    int off,
                                    int len)
                             throws java.io.IOException
Writes the cache and bufferToAppend to the underlying stream as one large chunk

Parameters:
bufferToAppend -
off -
len -
Throws:
java.io.IOException
Since:
3.0

writeClosingChunk

protected void writeClosingChunk()
                          throws java.io.IOException
Throws:
java.io.IOException

finish

public void finish()
            throws java.io.IOException
Must be called to ensure the internal cache is flushed and the closing chunk is written.

Throws:
java.io.IOException
Since:
3.0

write

public void write(int b)
           throws java.io.IOException
Specified by:
write in class java.io.OutputStream
Throws:
java.io.IOException

write

public void write(byte[] b)
           throws java.io.IOException
Writes the array. If the array does not fit within the buffer, it is not split, but rather written out as one large chunk.

Overrides:
write in class java.io.OutputStream
Parameters:
b -
Throws:
java.io.IOException
Since:
3.0

write

public void write(byte[] src,
                  int off,
                  int len)
           throws java.io.IOException
Overrides:
write in class java.io.OutputStream
Throws:
java.io.IOException

flush

public void flush()
           throws java.io.IOException
Flushes the underlying stream, but leaves the internal buffer alone.

Specified by:
flush in interface java.io.Flushable
Overrides:
flush in class java.io.OutputStream
Throws:
java.io.IOException

close

public void close()
           throws java.io.IOException
Finishes writing to the underlying stream, but does NOT close the underlying stream.

Specified by:
close in interface java.io.Closeable
Overrides:
close in class java.io.OutputStream
Throws:
java.io.IOException


Copyright 2005-2005-2006 Apache Software Foundation. All Rights Reserved.