Open Table Of Contents

Source code for bridgedb.parse.headers

# -*- coding: utf-8 -*-
#
# This file is part of BridgeDB, a Tor bridge distribution system.
#
# :authors: Isis Lovecruft 0xA3ADB67A2CDB8B35 <isis@torproject.org>
#           please also see AUTHORS file
# :copyright: (c) 2013 Isis Lovecruft
#             (c) 2007-2013, The Tor Project, Inc.
#             (c) 2007-2013, all entities within the AUTHORS file
# :license: 3-clause BSD, see included LICENSE for information

"""Parsers for HTTP and Email headers.

.. py:module:: bridgedb.parse.headers
    :synopsis: Parsers for HTTP and Email headers.

bridgedb.parse.headers
=======================
::

 parseAcceptLanguage - Parse the contents of a client 'Accept-Language' header
..
"""

[docs]def parseAcceptLanguage(header): """Parse the contents of a client 'Accept-Language' header. Parse the header in the following manner: 1. If ``header`` is None or an empty string, return an empty list. 2. Split the ``header`` string on any commas. 3. Chop of the RFC2616 quality/level suffix. We ignore these, and just use the order of the list as the preference order, without any parsing of quality/level assignments. 4. Add a fallback language of the same type if it is missing. For example, if we only got ['es-ES', 'de-DE'], add 'es' after 'es-ES' and add 'de' after 'de-DE'. 5. Change all hyphens to underscores. :param string header: The contents of an 'Accept-Language' header, i.e. as if taken from :api:`twisted.web.server.Request.getHeader`. :rtype: list :returns: A list of language codes (with and without locales), in order of preference. """ langs = [] if not header: return langs langHeader = header.split(',') for lang in langHeader: if lang.find(';') != -1: # Chop off the RFC2616 Accept `q=` and `level=` feilds code, _ = lang.split(';') langs.append(code) else: langs.append(lang) # Add a fallback language of the same type if it is missing. langsWithLocales = filter(lambda x: '-' in x, langs) langsOnly = map(lambda x: x.split('-')[0], langsWithLocales) for only in langsOnly: if only not in langs: # Add the fallback after the other languages like it: insertAfter = filter(lambda x: x.startswith(only), [x for x in langs]) if insertAfter: placement = langs.index(insertAfter[0]) + 1 langs.insert(placement, only) continue # Otherwise just put it at the end langs.append(only) # Gettext wants underderscores, because that is how it creates the # directories under i18n/, not hyphens: langs = map(lambda x: x.replace('-', '_'), [x for x in langs]) return langs