Class ChunkedInputStream

  • All Implemented Interfaces:
    Closeable, AutoCloseable, Hurryable

    public class ChunkedInputStream
    extends InputStream
    implements Hurryable
    A ChunkedInputStream provides a stream for reading a body of a http message that can be sent as a series of chunks, each with its own size indicator. Optionally the last chunk can be followed by trailers containing entity-header fields.

    A ChunkedInputStream is also Hurryable so it can be hurried to the end of the stream if the bytes are available on the underlying stream.

    • Constructor Detail

      • ChunkedInputStream

        public ChunkedInputStream​(InputStream in,
                                  HttpClient hc,
                                  MessageHeader responses)
                           throws IOException
        Creates a ChunkedInputStream and saves its arguments, for later use.
        Parameters:
        in - the underlying input stream.
        hc - the HttpClient
        responses - the MessageHeader that should be populated with optional trailers.
        Throws:
        IOException
    • Method Detail

      • read

        public int read()
                 throws IOException
        See the general contract of the read method of InputStream.
        Specified by:
        read in class InputStream
        Returns:
        the next byte of data, or -1 if the end of the stream is reached.
        Throws:
        IOException - if an I/O error occurs.
        See Also:
        FilterInputStream.in
      • read

        public int read​(byte[] b,
                        int off,
                        int len)
                 throws IOException
        Reads bytes from this stream into the specified byte array, starting at the given offset.
        Overrides:
        read in class InputStream
        Parameters:
        b - destination buffer.
        off - offset at which to start storing bytes.
        len - maximum number of bytes to read.
        Returns:
        the number of bytes read, or -1 if the end of the stream has been reached.
        Throws:
        IOException - if an I/O error occurs.
        See Also:
        InputStream.read()
      • available

        public int available()
                      throws IOException
        Returns the number of bytes that can be read from this input stream without blocking.
        Overrides:
        available in class InputStream
        Returns:
        the number of bytes that can be read from this input stream without blocking.
        Throws:
        IOException - if an I/O error occurs.
        See Also:
        FilterInputStream.in
      • close

        public void close()
                   throws IOException
        Close the stream by either returning the connection to the keep alive cache or closing the underlying stream.

        If the chunked response hasn't been completely read we try to "hurry" to the end of the response. If this is possible (without blocking) then the connection can be returned to the keep alive cache.

        Specified by:
        close in interface AutoCloseable
        Specified by:
        close in interface Closeable
        Overrides:
        close in class InputStream
        Throws:
        IOException - if an I/O error occurs.
      • hurry

        public boolean hurry()
        Hurry the input stream by reading everything from the underlying stream. If the last chunk (and optional trailers) can be read without blocking then the stream is considered hurried.

        Note that if an error has occured or we can't get to last chunk without blocking then this stream can't be hurried and should be closed.

        Specified by:
        hurry in interface Hurryable
        Returns:
        a boolean indicating if the stream has been hurried or not.