avoid duplicate Content-Length header in DefaultClient - #3451
Conversation
|
any update? |
|
Thanks for the fix and the wire-level regression test! We ended up merging #3448, which removes the manual Content-Length write from the header loop entirely and lets the JDK own the header — that also covers the bodyless-request duplicate this PR guards against (the "0" fallback now fires exactly once). Holding off on merging this one to avoid stacking two untested-in-combination changes to the same code path; if you think the containsKey guard is still needed on top of #3448, happy to revisit. |
|
Checked this against current repro: body-less So agreed, the guard isn't needed any more. The header loop no longer writes |
Repro: send a body-less
POST/PUTwhose template already carries aContent-Lengthheader (e.g.@Headers("Content-Length: 0")), withsun.net.http.allowRestrictedHeaders=trueso the header reaches the wire.Cause:
DefaultClient.convertAndSendwrites the requestContent-Lengthin the header loop and then unconditionally adds a secondContent-Length: 0for every body-less method that allows a body, so the field goes out twice. RFC 7230 §3.3.2 forbids generating multipleContent-Lengthfields; the duplicate is ambiguous framing and servers reject it (Tomcat returns400, #2862).Fix: only add the fallback
Content-Length: 0when the request does not already declare aContent-Length.The regression test is gated on
sun.net.http.allowRestrictedHeaderslike the existingContent-Lengthtests, sinceHttpURLConnectionotherwise drops the restricted header, and asserts the field is sent once.