summaryrefslogtreecommitdiff
path: root/paste/util
diff options
context:
space:
mode:
authorIan Bicking <ianb@colorstudy.com>2010-06-23 17:13:29 -0500
committerIan Bicking <ianb@colorstudy.com>2010-06-23 17:13:29 -0500
commit07a327e095e30c807a75acb8527e9b947d0ff062 (patch)
treed830473944a655a68d7b3e27c1e3342c9cb01f38 /paste/util
parent822c4caa34bce0cc9a05331ea7d55902a4ad2122 (diff)
downloadpaste-07a327e095e30c807a75acb8527e9b947d0ff062.tar.gz
add a missing desired_matches function to mimeparse (was removed upstream, but still used in paste)
Diffstat (limited to 'paste/util')
-rw-r--r--paste/util/mimeparse.py45
1 files changed, 34 insertions, 11 deletions
diff --git a/paste/util/mimeparse.py b/paste/util/mimeparse.py
index 0fd91e7..a8793b2 100644
--- a/paste/util/mimeparse.py
+++ b/paste/util/mimeparse.py
@@ -1,7 +1,7 @@
"""MIME-Type Parser
This module provides basic functions for handling mime-types. It can handle
-matching mime-types against a list of media-ranges. See section 14.1 of
+matching mime-types against a list of media-ranges. See section 14.1 of
the HTTP specification [RFC 2616] for a complete explanation.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
@@ -11,7 +11,7 @@ Contents:
- parse_media_range(): Media-ranges are mime-types with wild-cards and a 'q' quality parameter.
- quality(): Determines the quality ('q') of a mime-type when compared against a list of media-ranges.
- quality_parsed(): Just like quality() except the second parameter must be pre-parsed.
- - best_match(): Choose the mime-type with the highest quality ('q') from a list of candidates.
+ - best_match(): Choose the mime-type with the highest quality ('q') from a list of candidates.
"""
__version__ = "0.1.2"
@@ -47,7 +47,7 @@ def parse_media_range(range):
('application', '*', {'q', '0.5'})
- In addition this function also guarantees that there
+ In addition this function also guarantees that there
is a value for 'q' in the params dictionary, filling it
in with a proper default if necessary.
"""
@@ -59,14 +59,14 @@ def parse_media_range(range):
return (type, subtype, params)
def fitness_and_quality_parsed(mime_type, parsed_ranges):
- """Find the best match for a given mime-type against
- a list of media_ranges that have already been
+ """Find the best match for a given mime-type against
+ a list of media_ranges that have already been
parsed by parse_media_range(). Returns a tuple of
the fitness value and the value of the 'q' quality
parameter of the best match, or (-1, 0) if no match
was found. Just as for quality_parsed(), 'parsed_ranges'
must be a list of parsed media ranges. """
- best_fitness = -1
+ best_fitness = -1
best_fit_q = 0
(target_type, target_subtype, target_params) =\
parse_media_range(mime_type)
@@ -82,7 +82,7 @@ def fitness_and_quality_parsed(mime_type, parsed_ranges):
if fitness > best_fitness:
best_fitness = fitness
best_fit_q = params['q']
-
+
return best_fitness, float(best_fit_q)
def quality_parsed(mime_type, parsed_ranges):
@@ -101,18 +101,18 @@ def quality(mime_type, ranges):
>>> quality('text/html','text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5')
0.7
-
- """
+
+ """
parsed_ranges = [parse_media_range(r) for r in ranges.split(",")]
return quality_parsed(mime_type, parsed_ranges)
def best_match(supported, header):
"""Takes a list of supported mime-types and finds the best
match for all the media-ranges listed in header. The value of
- header must be a string that conforms to the format of the
+ header must be a string that conforms to the format of the
HTTP Accept: header. The value of 'supported' is a list of
mime-types.
-
+
>>> best_match(['application/xbel+xml', 'text/xml'], 'text/*;q=0.5,*/*; q=0.1')
'text/xml'
"""
@@ -121,3 +121,26 @@ def best_match(supported, header):
for mime_type in supported]
weighted_matches.sort()
return weighted_matches[-1][0][1] and weighted_matches[-1][1] or ''
+
+def desired_matches(desired, header):
+ """Takes a list of desired mime-types in the order the server prefers to
+ send them regardless of the browsers preference.
+
+ Browsers (such as Firefox) technically want XML over HTML depending on how
+ one reads the specification. This function is provided for a server to
+ declare a set of desired mime-types it supports, and returns a subset of
+ the desired list in the same order should each one be Accepted by the
+ browser.
+
+ >>> sorted_match(['text/html', 'application/xml'], \
+ ... 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png')
+ ['text/html', 'application/xml']
+ >>> sorted_match(['text/html', 'application/xml'], 'application/xml,application/json')
+ ['application/xml']
+ """
+ matches = []
+ parsed_ranges = [parse_media_range(r) for r in header.split(",")]
+ for mimetype in desired:
+ if quality_parsed(mimetype, parsed_ranges):
+ matches.append(mimetype)
+ return matches