diff options
author | Ian Bicking <ianb@colorstudy.com> | 2010-06-23 17:13:29 -0500 |
---|---|---|
committer | Ian Bicking <ianb@colorstudy.com> | 2010-06-23 17:13:29 -0500 |
commit | 07a327e095e30c807a75acb8527e9b947d0ff062 (patch) | |
tree | d830473944a655a68d7b3e27c1e3342c9cb01f38 /paste/util | |
parent | 822c4caa34bce0cc9a05331ea7d55902a4ad2122 (diff) | |
download | paste-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.py | 45 |
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 |