Class DeferredContentProvider

  • All Implemented Interfaces:
    Closeable, AutoCloseable, Iterable<ByteBuffer>, ContentProvider, AsyncContentProvider, Callback, Invocable

    public class DeferredContentProvider
    extends Object
    implements AsyncContentProvider, Callback, Closeable
    The Eclipse Jetty and Apache Felix Http Jetty packages are no longer supported.
    A ContentProvider that allows to add content after Request.send(Response.CompleteListener) has been called, therefore providing the request content at a later time.

    DeferredContentProvider can only be used in conjunction with Request.send(Response.CompleteListener) (and not with its blocking counterpart Request.send()) because it provides content asynchronously.

    The deferred content is provided once and then fully consumed. Invocations to the iterator() method after the first will return an "empty" iterator because the stream has been consumed on the first invocation. However, it is possible for subclasses to override offer(ByteBuffer) and close() to copy the content to another location (for example a file) and be able to support multiple invocations of of iterator() returning the iterator provided by this class on the first invocation, and an iterator on the bytes copied to the other location for subsequent invocations.

    Typical usage of DeferredContentProvider is in asynchronous proxies, where HTTP headers arrive separately from HTTP content chunks.

    The deferred content must be provided through offer(ByteBuffer), which can be invoked multiple times, and when all content has been provided it must be signaled with a call to close().

    Example usage:

      HttpClient httpClient = ...;
      // Use try-with-resources to autoclose DeferredContentProvider
      try (DeferredContentProvider content = new DeferredContentProvider())
          httpClient.newRequest("localhost", 8080)
                  .send(new Response.CompleteListener()
                      public void onComplete(Result result)
                          // Your logic here
          // At a later time...
          content.offer(ByteBuffer.wrap("some content".getBytes()));
    • Constructor Detail

      • DeferredContentProvider

        public DeferredContentProvider​(ByteBuffer... buffers)
        Creates a new DeferredContentProvider with the given initial content
        buffers - the initial content
    • Method Detail

      • getLength

        public long getLength()
        Specified by:
        getLength in interface ContentProvider
        the content length, if known, or -1 if the content length is unknown
      • offer

        public boolean offer​(ByteBuffer buffer)
        Adds the given content buffer to this content provider and notifies the listener that content is available.
        buffer - the content to add
        true if the content was added, false otherwise
      • close

        public void close()
        No more content will be added to this content provider and notifies the listener that no more content is available.
        Specified by:
        close in interface AutoCloseable
        Specified by:
        close in interface Closeable
      • isClosed

        public boolean isClosed()
      • failed

        public void failed​(Throwable failure)
        Description copied from interface: Callback

        Callback invoked when the operation fails.

        Specified by:
        failed in interface Callback
        failure - the reason for the operation failure