2016-12-12 3 views
1

Я хочу разобрать заголовок Accept-Language. Все ответы, которые я нахожу, касаются разбора строки, но не обрабатывают случай плохо отформатированного ввода.Обнаружение плохо отформатированного HTTP-заголовка Accept-Language

Например, что делать, если пользователь отправляет этот заголовок Accept-Language: en,es;q=0.5;*;q=0.5, который плохо отформатирован из-за второго ;. Есть ли какой-либо пакет, который может предложить легкий синтаксический анализ и соответствующее повышение уровня исключения?

+0

Это, безусловно, зависит от того, какой язык вы используете, и что вы подразумеваете под языком «Парсы». Вы просто хотите получить токены, такие как 'en' и' es'? Что вы хотите сделать с 'q = 0.5'? Вы хотите проигнорировать это или выбросить ошибку? –

+0

В случае плохо отформатированного заголовка я хочу, чтобы пользователь знал, но для обнаружения плохо отформатированного заголовка я предпочитаю не жестко кодировать правила – LetsPlayYahtzee

+0

Тогда возникает вопрос, как выглядит «хороший» заголовок? Кому-то придется определять правила для правильно отформатированного заголовка, и вы можете использовать это правило для разбора заголовка. Если в какой-то момент заголовок не соответствует правилу, то он плохо отформатирован. 'q = 0,5' представляет собой вес, и он должен всегда появляться после языковой мнемоники. Вы могли бы использовать это как основное правило для следования –

ответ

0

Во-первых, вы должны начать с понимания правильного формата заголовка Accept-Language: https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4

Вы можете увидеть определение поля в Accept-Language заголовка является:

Accept-Language = "Accept-Language" ":" 
        1#(language-range [ ";" "q" "=" qvalue ]) 
     language-range = ((1*8ALPHA *("-" 1*8ALPHA)) | "*") 

Пример правильного формата заголовка : Accept-Language: da, en-gb;q=0.8, en;q=0.7. Вы можете видеть, что каждая запятая , разделяет языковые кортежи, где каждый языковой набор равен language-range и quality weight (необязательно).

Теперь, когда вы знаете, как определяется заголовок Accept-Language, единственная проблема заключается в том, как его разобрать.

Вы можете осуществить это во многом зависит от языка, но я буду писать псевдо-код:

function parseAcceptLanguageHeader(headerValue): 
    parsedLanguages = [] 
    languageStrings = headerValue.split(",") 
    foreach languageStrings as S do 
     parsedLanguages.add(parse(S)) 
    return parsedLanguages 


// Here we define parse(S) 
function parse(S): // expecting format of S to be like: 'language-range [";q=<number>"]' 
    vals = S.trim().split(";") // remove leading and trailing spaces and split by ; 
    if vals.length == 1: // means 'q=qvalue' part is missing 
     return vals[0].trim(), 1.0 // default q is 1.0; you can additionally verify that vals[0] is one of the languages that you support 
    else if vals.length == 2: 
     return vals[0].trim(), parseQuality(vals[1]) 
    else raise an error ("Expected two tokens but, got: " + S) 


// Implement parse quality 
function parseQuality(S): 
    // We expect to see 'q=<number>' 
    vals = q.split("=") 
    if (vals.length != 2): 
    raise an error ("Expected exactly two tokens for quality, but got: " + S) 
    else if (vals[0] != 'q'): 
    raise an error ("Expected quality (q) but got: " + S) 
    else 
    return parseInt(vals[1].trim()) // This can also throw an error, but I am not going to write implementation for that function 

Обратите внимание, что в зависимости от языка дело с ошибками отличается.

+0

Извините, но ответ не затрагивает мой вопрос вообще. Во-первых, я не понимаю, почему вы предполагаете, что я не знал о надлежащем формате, так как мой вопрос не указывает аналогично, и во-вторых, все, о чем я прошу, - это если есть пакет, который может позаботиться о разборе заголовка и в Если он обнаружит плохо отформатированный заголовок, он даст мне знать, что я хочу избежать, это реализовать обнаружение. Поскольку, поскольку вы также упомянули, что формат заголовка правильно указан в протоколе, может быть какой-то механизм проверки протокола, который мог бы выполнить это задание. – LetsPlayYahtzee

+0

Ок, я вижу. Полагаю, вы должны быть более ясными, чтобы избежать путаницы.Вы ищете библиотеку на определенном языке или это не важно для вас? –

+0

да, я ищу пакет python, thnx для поиска времени – LetsPlayYahtzee