Repository navigation
Format JSON bodies regardless of MIME type casing - #1977
charan-rathore wants to merge 1 commit into
Conversation
JSONFormatter matched the content type case-sensitively, so a response declared as APPLICATION/JSON (or any other casing) was printed raw instead of being pretty-printed. Lower-case the MIME string before matching, as RFC 9110 media types are case-insensitive. Fixes httpie#1958. Signed-off-by: Charan Rathore <180254320+charan-rathore@users.noreply.github.com>
rahul05ranjan
left a comment
There was a problem hiding this comment.
Verified the fix against the PR head directly (instantiated JSONFormatter with format_options={'json': {'format': True, 'sort_keys': True, 'indent': 4}}, explicit_json=False):
- old code:
format_body('{"a": 1}', 'APPLICATION/JSON')returns the body raw — the #1958 bug. - this PR: it returns pretty-printed output;
Application/Problem+JSON; charset=UTF-8likewise. - parity and passthrough behavior preserved: upper-cased non-JSON MIME types now behave exactly like their lower-case forms, and non-JSON bodies (
'not json') still pass through untouched underAPPLICATION/JSON.
The one-line placement is right — mime is only used for the token match in this method, so lowering it up front can't affect anything else.
One scope observation, not a blocker: the same case-sensitive match still exists in httpie/output/formatters/xml.py:60 (if 'xml' not in mime:), so Application/XML responses will stay unformatted even after this change. Since media types are case-insensitive per RFC 9110 there too, it might be worth either covering it here or as a follow-up.
Tests look solid — TestJSONFormatterMIME covers the exact case variants and the non-JSON parity, and the class docstring pins the issue reference.
Fixes #1958.
JSONFormatter.format_bodymatches the response MIME type againstjson/javascript/texttokens case-sensitively, so a server declaringAPPLICATION/JSON(or any non-lowercase casing) gets its body printed raw instead of pretty-printed. Media types are case-insensitive (RFC 9110), so the MIME string is now lower-cased before matching. Displayed content is untouched.Added
TestJSONFormatterMIMEintests/test_output.py:application/json,APPLICATION/JSON, andApplication/Problem+JSON; charset=UTF-8all produce multi-line output that parses back to the original object, plus a parity check that upper-cased non-JSON MIME types behave exactly like their lower-case forms.Verified: the case-insensitive tests fail without the change and pass with it; full
tests/test_output.pypasses (126 passed, 3 xfailed).