diff options
| author | Jake Howard <git@theorangeone.net> | 2025-05-27 17:00:29 +0100 |
|---|---|---|
| committer | Natalia <124304+nessita@users.noreply.github.com> | 2025-06-03 16:11:38 -0300 |
| commit | 0c548e62d0166c559ca59845079c2b70730fcfe7 (patch) | |
| tree | 916817a120675d7ace091d337ef8f47376a7861f /docs/ref | |
| parent | 2bf4c5b9eaaf0a36cb0fb6c060625a5fb2fcf6c9 (diff) | |
[5.2.x] Fixed #36411 -- Made HttpRequest.get_preferred_type() consider media type parameters.
HttpRequest.get_preferred_type() did not account for parameters in
Accept header media types (e.g., "text/vcard; version=3.0"). This caused
incorrect content negotiation when multiple types differed only by
parameters, reducing specificity as per RFC 7231 section 5.3.2
(https://datatracker.ietf.org/doc/html/rfc7231.html#section-5.3.2).
This fix updates get_preferred_type() to treat media types with
parameters as distinct, allowing more precise and standards-compliant
matching.
Thanks to magicfelix for the report, and to David Sanders and Sarah
Boyce for the reviews.
Backport of c075508b4de8edf9db553b409f8a8ed2f26ecead from main.
Diffstat (limited to 'docs/ref')
| -rw-r--r-- | docs/ref/request-response.txt | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt index 632e222998..c9fb05af1d 100644 --- a/docs/ref/request-response.txt +++ b/docs/ref/request-response.txt @@ -445,6 +445,41 @@ Methods >>> request.get_preferred_type(["application/xml", "text/plain"]) None + If the mime type includes parameters, these are also considered when + determining the preferred media type. For example, with an ``Accept`` + header of ``text/vcard;version=3.0,text/html;q=0.5``, the return value of + ``request.get_preferred_type()`` depends on the available media types: + + .. code-block:: pycon + + >>> request.get_preferred_type( + ... [ + ... "text/vcard; version=4.0", + ... "text/vcard; version=3.0", + ... "text/vcard", + ... "text/directory", + ... ] + ... ) + "text/vcard; version=3.0" + >>> request.get_preferred_type( + ... [ + ... "text/vcard; version=4.0", + ... "text/html", + ... ] + ... ) + "text/html" + >>> request.get_preferred_type( + ... [ + ... "text/vcard; version=4.0", + ... "text/vcard", + ... "text/directory", + ... ] + ... ) + None + + (For further details on how content negotiation is performed, see + :rfc:`7231#section-5.3.2`.) + Most browsers send ``Accept: */*`` by default, meaning they don't have a preference, in which case the first item in ``media_types`` would be returned. |
