Class HttpFields.Mutable

java.lang.Object
org.eclipse.jetty.http.HttpFields.Mutable
All Implemented Interfaces:
Iterable<HttpField>, HttpFields
Direct Known Subclasses:
HttpTester.Message
Enclosing interface:
HttpFields

public static class HttpFields.Mutable extends Object implements Iterable<HttpField>, HttpFields
HTTP Fields. A collection of HTTP header and or Trailer fields.

This class is not synchronized as it is expected that modifications will only be performed by a single thread.

The cookie handling provided by this class is guided by the Servlet specification and RFC6265.

  • Constructor Details

    • Mutable

      protected Mutable()
      Initialize an empty HttpFields.
  • Method Details

    • add

      public HttpFields.Mutable add(String name, String value)
      Add to or set a field. If the field is allowed to have multiple values, add will add multiple headers of the same name.
      Parameters:
      name - the name of the field
      value - the value of the field.
      Returns:
      this builder
    • add

      public HttpFields.Mutable add(HttpHeader header, HttpHeaderValue value)
    • add

      public HttpFields.Mutable add(HttpHeader header, String value)
      Add to or set a field. If the field is allowed to have multiple values, add will add multiple headers of the same name.
      Parameters:
      header - the header
      value - the value of the field.
      Returns:
      this builder
    • add

      public HttpFields.Mutable add(HttpField field)
    • add

      public HttpFields.Mutable add(HttpFields fields)
    • addCSV

      public HttpFields.Mutable addCSV(HttpHeader header, String... values)
      Add comma separated values, but only if not already present.
      Parameters:
      header - The header to add the value(s) to
      values - The value(s) to add
      Returns:
      this builder
    • addCSV

      public HttpFields.Mutable addCSV(String name, String... values)
      Add comma separated values, but only if not already present.
      Parameters:
      name - The header to add the value(s) to
      values - The value(s) to add
      Returns:
      this builder
    • addDateField

      public HttpFields.Mutable addDateField(String name, long date)
      Sets the value of a date field.
      Parameters:
      name - the field name
      date - the field date value
      Returns:
      this builder
    • asImmutable

      public HttpFields.Immutable asImmutable()
      Specified by:
      asImmutable in interface HttpFields
    • clear

      public HttpFields.Mutable clear()
    • ensureField

      public void ensureField(HttpField field)
      Ensure that specific HttpField exists when the field may not exist or may exist and be multi valued. Multiple existing fields are merged into a single field.
      Parameters:
      field - The header to ensure is contained. The field is used directly if possible so PreEncodedHttpFields can be passed. If the value needs to be merged with existing values, then a new field is created.
    • equals

      public boolean equals(Object o)
      Overrides:
      equals in class Object
    • getField

      public HttpField getField(int index)
      Get a Field by index.
      Specified by:
      getField in interface HttpFields
      Parameters:
      index - the field index
      Returns:
      A Field value or null if the Field value has not been set
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • iterator

      public Iterator<HttpField> iterator()
      Specified by:
      iterator in interface Iterable<HttpField>
    • listIterator

      public ListIterator<HttpField> listIterator()
    • put

      public HttpFields.Mutable put(HttpField field)
    • put

      public HttpFields.Mutable put(String name, String value)
      Set a field.
      Parameters:
      name - the name of the field
      value - the value of the field. If null the field is cleared.
      Returns:
      this builder
    • put

      public HttpFields.Mutable put(HttpHeader header, HttpHeaderValue value)
    • put

      public HttpFields.Mutable put(HttpHeader header, String value)
      Set a field.
      Parameters:
      header - the header name of the field
      value - the value of the field. If null the field is cleared.
      Returns:
      this builder
    • put

      public HttpFields.Mutable put(String name, List<String> list)
      Set a field.
      Parameters:
      name - the name of the field
      list - the List value of the field. If null the field is cleared.
      Returns:
      this builder
    • putDateField

      public HttpFields.Mutable putDateField(HttpHeader name, long date)
      Sets the value of a date field.
      Parameters:
      name - the field name
      date - the field date value
      Returns:
      this builder
    • putDateField

      public HttpFields.Mutable putDateField(String name, long date)
      Sets the value of a date field.
      Parameters:
      name - the field name
      date - the field date value
      Returns:
      this builder
    • putLongField

      public HttpFields.Mutable putLongField(HttpHeader name, long value)
      Sets the value of an long field.
      Parameters:
      name - the field name
      value - the field long value
      Returns:
      this builder
    • putLongField

      public HttpFields.Mutable putLongField(String name, long value)
      Sets the value of an long field.
      Parameters:
      name - the field name
      value - the field long value
      Returns:
      this builder
    • computeField

      public void computeField(HttpHeader header, BiFunction<HttpHeader,List<HttpField>,HttpField> computeFn)

      Computes a single field for the given HttpHeader and for existing fields with the same header.

      The compute function receives the field name and a list of fields with the same name so that their values can be used to compute the value of the field that is returned by the compute function. If the compute function returns null, the fields with the given name are removed.

      This method comes handy when you want to add an HTTP header if it does not exist, or add a value if the HTTP header already exists, similarly to Map.compute(Object, BiFunction).

      This method can be used to put a new field (or blindly replace its value):

       httpFields.computeField("X-New-Header",
           (name, fields) -> new HttpField(name, "NewValue"));
       

      This method can be used to coalesce many fields into one:

       // Input:
       GET / HTTP/1.1
       Host: localhost
       Cookie: foo=1
       Cookie: bar=2,baz=3
       User-Agent: Jetty
      
       // Computation:
       httpFields.computeField("Cookie", (name, fields) ->
       {
           // No cookies, nothing to do.
           if (fields == null)
               return null;
      
           // Coalesces all cookies.
           String coalesced = fields.stream()
               .flatMap(field -> Stream.of(field.getValues()))
               .collect(Collectors.joining(", "));
      
           // Returns a single Cookie header with all cookies.
           return new HttpField(name, coalesced);
       }
      
       // Output:
       GET / HTTP/1.1
       Host: localhost
       Cookie: foo=1, bar=2, baz=3
       User-Agent: Jetty
       

      This method can be used to replace a field:

       httpFields.computeField("X-Length", (name, fields) ->
       {
           if (fields == null)
               return null;
      
           // Get any value among the X-Length headers.
           String length = fields.stream()
               .map(HttpField::getValue)
               .findAny()
               .orElse("0");
      
           // Replace X-Length headers with X-Capacity header.
           return new HttpField("X-Capacity", length);
       });
       

      This method can be used to remove a field:

       httpFields.computeField("Connection", (name, fields) -> null);
       
      Parameters:
      header - the HTTP header
      computeFn - the compute function
    • computeField

      public void computeField(String name, BiFunction<String,List<HttpField>,HttpField> computeFn)

      Computes a single field for the given HTTP header name and for existing fields with the same name.

      Parameters:
      name - the HTTP header name
      computeFn - the compute function
      See Also:
    • remove

      public HttpFields.Mutable remove(HttpHeader name)
      Remove a field.
      Parameters:
      name - the field to remove
      Returns:
      this builder
    • remove

      public HttpFields.Mutable remove(EnumSet<HttpHeader> fields)
    • remove

      public HttpFields.Mutable remove(String name)
      Remove a field.
      Parameters:
      name - the field to remove
      Returns:
      this builder
    • size

      public int size()
      Specified by:
      size in interface HttpFields
    • stream

      public Stream<HttpField> stream()
      Specified by:
      stream in interface HttpFields
    • toString

      public String toString()
      Overrides:
      toString in class Object