Hi,
I've been working on trailer header implementation. No particular issues
with requests but the response implementation is identifying a lot of
questions.
The first one is triggered by Section 4.4 for RFC 7230:
<quote
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.
</quote>
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
committed?
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?
Mark