* Support multiple headers sharing the same name
* Apply suggestions
* Don't normalize HTTP header names
* apply visual suggestions
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* bump down multidict to 4.7.0
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* change behavior of '--quiet' to silence errors and warnings when passed twice together with '--check-status'
* Apply suggestions from code review
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* remove header, trailing comma, rename constant and variable
* fix flags for tests
* [skip ci] Update ticket number
Co-authored-by: Dave <d.kreeft@outlook.com>
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
Co-authored-by: Mickaël Schoentgen <contact@tiger-222.fr>
* 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>
* Allow to override the response `Content-Type` from options
* Apply suggestions from code review
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Rename the option from `--response.content-type` to `--response-as`
* Update CHANGELOG.md
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
In some special cases, to prevent against Cross Site Script Inclusion (XSSI)
attacks, the JSON response body starts with a magic prefix line that must be
stripped before feeding the rest of the response body to the JSON parser.
Such prefix is now simply ignored from the parser but still printed in the
terminal.
* Fix Windows tests
* Add a workflow to check documentations
* Fix markdown issues
* Install Ruby 2.7
* Finally, handle and fix GitHub templates
* Minor improvement in the feature request template
* Verbose mode to be sure all files are checked
* Convert most of the documentation from the frontend `README.rst` to `docs/REAME.md`
Also converted all reStructuredText files to Markdown.
* Tell `mdformat` to use LF for end on lines
* `--check` is not needed in the help message
* Skip tests on GitHub Windows.
Those tests pass on a real Windows machine.
Let's revisit those failure later, if needed.
* Move `mdoformat` requirement from `test` to `dev` extra
To fix Fedora CI.
* Fix the handling of cookies from session files
* Apply suggestions from code review
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Fix test docstring formatting
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Support `requests.response.raw` being a file-like object
Previously HTTPie relied on `requests.models.Response.raw` being
`urllib3.HTTPResponse`. The `requests` documentation specifies that
(requests.models.Response.raw)[https://docs.python-requests.org/en/master/api/#requests.Response.raw]
is a file-like object but allows for other types for internal use.
This change introduces graceful handling for scenarios when
`requests.models.Response.raw` is not `urllib3.HTTPResponse`. In such a scenario
HTTPie now falls back to extracting metadata from `requests.models.Response`
directly instead of direct access from protected protected members such as
`response.raw._original_response`. A side effect in this fallback procedure is
that we can no longer determine HTTP protocol version and report it as `1.1`.
This change is necessary to make it possible to implement `TransportPlugins`
without having to also needing to emulate internal behavior of `urlib3` and
`http.client`.
* Load cookies from `response.headers` instead of `response.raw._original_response.msg._headers`
`response.cookies` was not utilized as it not possible to construct original
payload from `http.cookiejar.Cookie`. Data is stored in lossy format. For example
`Cookie.secure` defaults to `False` so we cannot distinguish if `Cookie.secure` was
set to `False` or was not set at all. Same problem applies to other fields also.
* Simpler HTTP envelope data extraction
* Test cookie extraction and make cookie presentment backwards compatible
Co-authored-by: Mickaël Schoentgen <contact@tiger-222.fr>
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Make sure there’s no trailing \n in test files for easier output inspection
* Refactor output matching test utils
* More robust `test_http_307_allow_redirect_post_verbose()`
* Changelog
* Mention HTTP 307 Temporary Redirect re-post behaviour in README
The fix may actually be slightly more complex than I expected.
We would need, at first sight, to loose the prepared requests + responses streaming.
A potential solution will come in a near future.
https://docs.python.org/3.10/whatsnew/3.10.html#enum
Python 3.10 changed the repr of enum members, and the doctest of tests.utils.http failed.
Exact reprs are unfortunately not considered stable API between Python releases:
=================================== FAILURES ===================================
__________________________ [doctest] tests.utils.http __________________________
209
210 Example:
211
212 $ http --auth=user:password GET pie.dev/basic-auth/user/password
213
214 >>> httpbin = getfixture('httpbin')
215 >>> r = http('-a', 'user:pw', httpbin.url + '/basic-auth/user/pw')
216 >>> type(r) == StrCLIResponse
217 True
218 >>> r.exit_status
Expected:
<ExitStatus.SUCCESS: 0>
Got:
ExitStatus.SUCCESS
A simple replacement of the expected output however breaks the doctest on Python 3.9.
This is the best solution I could think of
that keeps the docstring readable and doctest working in Pythons both old and new.
* Add --raw to allow specifying the raw request body without extra processing
As an alternative to `stdin`.
Co-authored-by: Elena Lape <elapinskaite@gmail.com>
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Update README.rst
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Update README.rst
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>
* Fix default HTTP method on empty data
Co-authored-by: Elena Lape <elapinskaite@gmail.com>
Co-authored-by: Jakub Roztocil <jakub@roztocil.co>