mirror of
https://github.com/httpie/cli.git
synced 2024-11-24 08:43:16 +01:00
4f1c9441c5
* Fix encoding error with non-prettified encoded responses
Removed `--format-option response.as` an promote `--response-as`: using
the format option would be misleading as it is now also used by non-prettified
responses.
* Encoding refactoring
* split --response-as into --response-mime and --response-charset
* add support for Content-Type charset for requests printed to terminal
* add support charset detection for requests printed to terminal without a Content-Type charset
* etc.
* `test_unicode.py` → `test_encoding.py`
* Drop sequence length check
* Clean-up tests
* [skip ci] Tweaks
* Use the compatible release clause for `charset_normalizer` requirement
Cf. https://www.python.org/dev/peps/pep-0440/#version-specifiers
* Clean-up
* Partially revert d52a4833e4
* Changelog
* Tweak tests
* [skip ci] Better test name
* Cleanup tests and add request body charset detection
* More test suite cleanups
* Cleanup
* Fix code style in test
* Improve detect_encoding() docstring
* Uniformize pytest.mark.parametrize() calls
* [skip ci] Comment out TODOs (will be tackled in a specific PR)
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
38 lines
1.0 KiB
Python
38 lines
1.0 KiB
Python
import json
|
|
import re
|
|
from typing import Tuple
|
|
|
|
from ..utils import load_json_preserve_order_and_dupe_keys
|
|
from .lexers.json import PREFIX_REGEX
|
|
|
|
|
|
def load_prefixed_json(data: str) -> Tuple[str, json.JSONDecoder]:
|
|
"""Simple JSON loading from `data`.
|
|
|
|
"""
|
|
# First, the full data.
|
|
try:
|
|
return '', load_json_preserve_order_and_dupe_keys(data)
|
|
except ValueError:
|
|
pass
|
|
|
|
# Then, try to find the start of the actual body.
|
|
data_prefix, body = parse_prefixed_json(data)
|
|
try:
|
|
return data_prefix, load_json_preserve_order_and_dupe_keys(body)
|
|
except ValueError:
|
|
raise ValueError('Invalid JSON')
|
|
|
|
|
|
def parse_prefixed_json(data: str) -> Tuple[str, str]:
|
|
"""Find the potential JSON body from `data`.
|
|
|
|
Sometimes the JSON body is prefixed with a XSSI magic string, specific to the server.
|
|
Return a tuple (data prefix, actual JSON body).
|
|
|
|
"""
|
|
matches = re.findall(PREFIX_REGEX, data)
|
|
data_prefix = matches[0] if matches else ''
|
|
body = data[len(data_prefix):]
|
|
return data_prefix, body
|