Class HttpFields.Mutable

  • All Implemented Interfaces:
    java.lang.Iterable<HttpField>, HttpFields
    Direct Known Subclasses:
    HttpTester.Message
    Enclosing interface:
    HttpFields

    public static class HttpFields.Mutable
    extends java.lang.Object
    implements java.lang.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 Detail

      • Mutable

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

      • add

        public HttpFields.Mutable add​(java.lang.String name,
                                      java.lang.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,
                                      java.lang.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
      • addCSV

        public HttpFields.Mutable addCSV​(HttpHeader header,
                                         java.lang.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​(java.lang.String name,
                                         java.lang.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​(java.lang.String name,
                                               long date)
        Sets the value of a date field.
        Parameters:
        name - the field name
        date - the field date value
        Returns:
        this builder
      • 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​(java.lang.Object o)
        Overrides:
        equals in class java.lang.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 java.lang.Object
      • iterator

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

        public java.util.ListIterator<HttpField> listIterator()
      • put

        public HttpFields.Mutable put​(java.lang.String name,
                                      java.lang.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,
                                      java.lang.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​(java.lang.String name,
                                      java.util.List<java.lang.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​(java.lang.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​(java.lang.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,
                                 java.util.function.BiFunction<HttpHeader,​java.util.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​(java.lang.String name,
                                 java.util.function.BiFunction<java.lang.String,​java.util.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:
        computeField(HttpHeader, BiFunction)
      • remove

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

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

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

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object