[jsr369-experts] Trailer header implementation

From: Mark Thomas <markt_at_apache.org>
Date: Wed, 3 May 2017 12:02:37 +0100


I've been working on trailer header implementation. No particular issues
with requests but the response implementation is identifying a lot of

The first one is triggered by Section 4.4 for RFC 7230:

   When a message includes a message body encoded with the chunked
   transfer coding and the sender desires to send metadata in the form
   of trailer fields at the end of the message, the sender SHOULD
   generate a Trailer header field before the message body to indicate
   which fields will be present in the trailers. This allows the
   recipient to prepare for receipt of that metadata before it starts
   processing the body, which is useful if the message is being streamed
   and the recipient wishes to confirm an integrity check on the fly.

1. How is the container meant to construct the Trailer header field? The
point of using a supplier was so the header names and values did not
have to be known when the response was committed. However, section 4.4
requires that the names are known.

The remaining questions are a little simpler:

2. What happens if setTrailerFields() is called after the response is

3. What happens if setTrailerFields() is called and trailer fields are
not supported (HTTP 0.9, HTTP 1.0, some proxy protocols, etc.)?

4. What happens if setTrailerFields() is called multiple times?

5. What happens if setTrailerFields() is called with a null Supplier?

My current thinking:

1) Do we ignore the 'SHOULD' or do we change the API? I'm leaning
towards changing the API on the basis that if we are going to add
trailer support we should do it as correctly as possible.

2) Throw an IllegalStateException
   But. It also depends on 1). If we don't have to set the Trailers
   header it may still be possible to send the trailer fields

3) Throw an IllegalStateException

4) Use the most recent Supplier

5) Allow it and protect against any possible NPE in the container

Of these, 1) is the most serious to address. After that, 2) & 3) since
the application has no way to tell if this is going to happen. Do we
need a boolean areTrailerFieldsSupported() method?