diff options
author | bbangert <devnull@localhost> | 2007-01-30 16:37:22 +0000 |
---|---|---|
committer | bbangert <devnull@localhost> | 2007-01-30 16:37:22 +0000 |
commit | baaa88d01ebe93fa129088331ffcb09ecd46a0c1 (patch) | |
tree | 7b749ecde11483676dfcfbfcc5475116f652582a /paste/httpheaders.py | |
parent | f3a41d80959005d2ad273aa5c88bad1957bb992e (diff) | |
download | paste-baaa88d01ebe93fa129088331ffcb09ecd46a0c1.tar.gz |
Adding language parsing HTTP header code.
Diffstat (limited to 'paste/httpheaders.py')
-rw-r--r-- | paste/httpheaders.py | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/paste/httpheaders.py b/paste/httpheaders.py index a658e5c..c07617b 100644 --- a/paste/httpheaders.py +++ b/paste/httpheaders.py @@ -135,6 +135,7 @@ dashes to give CamelCase style names. """ import urllib2 +import re from mimetypes import guess_type from rfc822 import formatdate, parsedate_tz, mktime_tz from time import time as now @@ -936,6 +937,39 @@ class _Range(_MultiValueHeader): return (units, ranges) _Range('Range', 'request', 'RFC 2616, 14.35') +class _AcceptLanguage(_MultiValueHeader): + """ + Accept-Language, RFC 2616 section 14.4 + """ + languageRegEx = re.compile(r"^[a-z]{2}(-[a-z]{2})?$", re.I) + def parse(self, *args, **kwargs): + """ + Return a list of language tags sorted by their "q" values. For example, + "en-us,en;q=0.5" should return ``["en-us", "en"]``. If there is no + ``Accept-Language`` header present, default to ``[]``. + """ + header = self.__call__(*args, **kwargs) + if header is None: + return [] + langs = header.split(",") + qs = [] + for lang in langs: + pieces = lang.split(";") + lang, params = pieces[0].strip().lower(), pieces[1:] + if not self.languageRegEx.match(lang): + continue + q = 1 + for param in params: + lvalue, rvalue = param.split("=") + lvalue = lvalue.strip().lower() + rvalue = rvalue.strip() + if lvalue == "q": + q = float(rvalue) + qs.append((lang, q)) + qs.sort(lambda a, b: -cmp(a[1], b[1])) + return [lang for (lang, q) in qs] +_AcceptLanguage('Accept-Language', 'request', 'RFC 2616, 14.4') + class _AcceptRanges(_MultiValueHeader): """ Accept-Ranges, RFC 2616 section 14.5 @@ -997,7 +1031,7 @@ for (name, category, version, style, comment) in \ (("Accept" ,'request' ,'1.1','multi-value','RFC 2616, 14.1' ) ,("Accept-Charset" ,'request' ,'1.1','multi-value','RFC 2616, 14.2' ) ,("Accept-Encoding" ,'request' ,'1.1','multi-value','RFC 2616, 14.3' ) -,("Accept-Language" ,'request' ,'1.1','multi-value','RFC 2616, 14.4' ) +#,("Accept-Language" ,'request' ,'1.1','multi-value','RFC 2616, 14.4' ) #,("Accept-Ranges" ,'response','1.1','multi-value','RFC 2616, 14.5' ) ,("Age" ,'response','1.1','singular' ,'RFC 2616, 14.6' ) ,("Allow" ,'entity' ,'1.0','multi-value','RFC 2616, 14.7' ) |