Cover IPv6 response endpoints and record how the body ceilings measure

Neither gap that had to be fixed in the C implementation exists here, but for
reasons worth writing down rather than rediscovering.

The body ceilings measure bytes actually read, not a declared Content-Length,
so a chunked body is bounded on the same terms as a declared one. The
form-urlencoded builder wraps the stream; the multipart path relies on
commons-fileupload2, which pairs its Content-Length fast path with a streaming
guard. SECURITY.md now says so, because the reverse is the easy mistake to make
when adding a limit: screening the header before the read leaves
Transfer-Encoding: chunked unbounded, which declares no length.

Address classification is address-family agnostic because it defers to
InetAddress rather than parsing hosts, and URI.getHost keeps the brackets in a
form InetAddress accepts. The one part not inherited is fc00::/7, since
isSiteLocalAddress answers only for the deprecated fec0::/10; isUniqueLocalIPv6
already covered it.

What was missing was any test at all: seventeen cases, none of them IPv6, so
the behaviour was right and unverified and a regression would have been silent.
Three tests now cover the always-refused set, the IPv4-mapped metadata address,
and loopback and unique-local under the private-network switch, plus a global
address as the control so the suite cannot pass by refusing IPv6 wholesale.
Removing the isUniqueLocalIPv6 clause fails exactly one of them; 20 pass with
it in place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 files changed