summaryrefslogtreecommitdiff
path: root/docs/ref/request-response.txt
diff options
context:
space:
mode:
authorJake Howard <git@theorangeone.net>2025-05-27 17:00:29 +0100
committernessita <124304+nessita@users.noreply.github.com>2025-06-03 16:10:41 -0300
commitc075508b4de8edf9db553b409f8a8ed2f26ecead (patch)
tree49ed74a80f9af3be8bf116ad8eb30b8856a4c199 /docs/ref/request-response.txt
parent26313bc21932d0d3af278ab387549d63b1f64575 (diff)
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.
Diffstat (limited to 'docs/ref/request-response.txt')
-rw-r--r--docs/ref/request-response.txt35
1 files changed, 35 insertions, 0 deletions
diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt
index 9846a3a4b5..805b36023a 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.