Class GzipAvailabilityInputStream

java.lang.Object
java.io.InputStream
java.io.FilterInputStream
software.amazon.awssdk.core.internal.io.GzipAvailabilityInputStream
All Implemented Interfaces:
Closeable, AutoCloseable, Releasable

@SdkInternalApi public final class GzipAvailabilityInputStream extends FilterInputStream implements Releasable
Wraps a response body so available() never returns 0 for gzip content while the stream is open. GZIPInputStream treats a transient 0 from available() at a member boundary as end of stream and stops, truncating concatenated gzip. Gzip is detected passively from the leading bytes (1f 8b 08); non-gzip streams keep honest available().
  • Constructor Details

    • GzipAvailabilityInputStream

      public GzipAvailabilityInputStream(InputStream in)
  • Method Details

    • wrap

      public static AbortableInputStream wrap(InputStream content, Abortable abortable)
      Wraps a response body's content so available() is gzip-safe, while preserving abort() on the original stream. Applied by the SDK at the sync and async blocking-stream boundaries (where the caller's GZIPInputStream reads), so that ResponseInputStream itself stays content-type agnostic.
    • read

      public int read() throws IOException
      Overrides:
      read in class FilterInputStream
      Throws:
      IOException
    • read

      public int read(byte[] b, int off, int len) throws IOException
      Overrides:
      read in class FilterInputStream
      Throws:
      IOException
    • available

      public int available() throws IOException
      Overrides:
      available in class FilterInputStream
      Throws:
      IOException
    • skip

      public long skip(long n) throws IOException
      Overrides:
      skip in class FilterInputStream
      Throws:
      IOException
    • mark

      public void mark(int readlimit)
      Overrides:
      mark in class FilterInputStream
    • reset

      public void reset() throws IOException
      Overrides:
      reset in class FilterInputStream
      Throws:
      IOException
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class FilterInputStream
      Throws:
      IOException
    • release

      public void release()
      Description copied from interface: Releasable
      Releases the allocated resource. This method should not be called except by the caller who allocated the resource at the very top of the call stack. This allows, typically, a Closeable resource to be not unintentionally released owing to the calling of the Closeable.close() methods by implementation deep down in the call stack.

      For example, the creation of a ResettableInputStream would entail physically opening a file. If the opened file is meant to be closed only (in a finally block) by the very same code block that created it, then it is necessary that the release method must not be called while the execution is made in other stack frames. In such case, as other stack frames may inadvertently or indirectly call the close method of the stream, the creator of the stream would need to explicitly disable the accidental closing via ResettableInputStream#disableClose(), so that the release method becomes the only way to truly close the opened file.

      Specified by:
      release in interface Releasable