Class MultiPart.AbstractContentSource

java.lang.Object
org.eclipse.jetty.http.MultiPart.AbstractContentSource
All Implemented Interfaces:
Closeable, AutoCloseable, org.eclipse.jetty.io.Content.Source
Direct Known Subclasses:
MultiPartByteRanges.ContentSource, MultiPartFormData.ContentSource
Enclosing class:
MultiPart

public abstract static class MultiPart.AbstractContentSource extends Object implements org.eclipse.jetty.io.Content.Source, Closeable

An asynchronous Content.Source where MultiPart.Parts can be added to it to form a multipart content.

When this Content.Source is read, it will produce the bytes (including boundary separators) in the multipart format.

Subclasses should override customizePartHeaders(Part) to produce the right part headers depending on the specific multipart subtype (for example, multipart/form-data or multipart/byteranges, etc.).

Typical asynchronous usage is the following:


 // Create a ContentSource subclass.
 ContentSource source = ...;

 // Add parts to the ContentSource.
 source.addPart(new ByteBufferPart());
 source.addPart(new PathPart());

 // Close the ContentSource to signal
 // that no more parts will be added.
 source.close();

 // The Sink where this ContentSource is written to.
 Content.Sink sink = ...;

 // Copy this ContentSource to the Sink.
 Content.copy(source, sink, Callback.from(...));
 

Reading from ContentSource may be performed at any time, even if not all the parts have been added yet.

Adding parts and calling close() may be done asynchronously from other threads.

Eventually, reading from ContentSource will produce a last chunk when all the parts have been added and this ContentSource has been closed.

  • Constructor Details

    • AbstractContentSource

      public AbstractContentSource(String boundary)
  • Method Details

    • getBoundary

      public String getBoundary()
      Returns:
      the boundary string
    • getPartHeadersMaxLength

      public int getPartHeadersMaxLength()
      Returns:
      the max length of a MultiPart.Part headers, in bytes, or -1 for unlimited length
    • setPartHeadersMaxLength

      public void setPartHeadersMaxLength(int partHeadersMaxLength)
      Parameters:
      partHeadersMaxLength - the max length of a MultiPart.Part headers, in bytes, or -1 for unlimited length
    • addPart

      public boolean addPart(MultiPart.Part part)

      Adds, if possible, the given MultiPart.Part to this ContentSource.

      Parts may be added until this ContentSource is closed.

      This method returns true if the part was added, false if the part cannot be added because this ContentSource is already closed, or because it has been failed.

      Parameters:
      part - the MultiPart.Part to add
      Returns:
      whether the part has been added
      See Also:
    • close

      public void close()

      Closes this ContentSource so that no more parts may be added.

      Once this method is called, reading from this ContentSource will eventually produce a terminal multipart/form-data boundary, when all the part bytes have been read.

      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
    • getLength

      public long getLength()
      Specified by:
      getLength in interface org.eclipse.jetty.io.Content.Source
    • read

      public org.eclipse.jetty.io.Content.Chunk read()
      Specified by:
      read in interface org.eclipse.jetty.io.Content.Source
    • customizePartHeaders

      protected HttpFields customizePartHeaders(MultiPart.Part part)
    • demand

      public void demand(Runnable demandCallback)
      Specified by:
      demand in interface org.eclipse.jetty.io.Content.Source
    • fail

      public void fail(Throwable failure)
      Specified by:
      fail in interface org.eclipse.jetty.io.Content.Source