Opened 15 years ago

Last modified 13 years ago

#12197 closed

parse_accept_lang_header parse HTTP_ACCEPT_LANGUAGE with wrong Quality factors — at Version 2

Reported by: flier.lu@… Owned by: nobody
Component: Internationalization Version: 1.1
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Adrian Holovaty)

According to the RFC 2616 <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html>, HTTP_ACCEPT_LANGUAGE could have several languages options, such as

da, en-gb;q=0.8, en;q=0.7

So, django parse those string with parse_accept_lang_header method, and order the options base on its 'q' quality factor.

But the re.split seems return a list with a empty string as first element, such as

s = 'da, en-gb;q=0.8, en;q=0.7'

r.split(s)

['', 'da', None, '', 'en-gb', '0.8', '', 'en', '0.7', '']

But parse_accept_lang_header use it from index 0, it means they align to wrong index

To fix the issues, you could modify the accept_language_re, or use the return list from index 1.

def parse_accept_lang_header(lang_string):
    """
    Parses the lang_string, which is the body of an HTTP Accept-Language
    header, and returns a list of (lang, q-value), ordered by 'q' values.

    Any format errors in lang_string results in an empty list being returned.
    """
    result = []
    pieces = accept_language_re.split(lang_string)
    if pieces[-1]:
        return []
    for i in range(0, len(pieces) - 1, 3):
        first, lang, priority = pieces[i : i + 3]
        if first:
            return []
        priority = priority and float(priority) or 1.0
        result.append((lang, priority))
    result.sort(lambda x, y: -cmp(x[1], y[1]))
    return result

Change History (2)

comment:1 by anonymous, 15 years ago

comment:2 by Adrian Holovaty, 15 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top