Во-первых, вы должны начать с понимания правильного формата заголовка 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
Обратите внимание, что в зависимости от языка дело с ошибками отличается.
Это, безусловно, зависит от того, какой язык вы используете, и что вы подразумеваете под языком «Парсы». Вы просто хотите получить токены, такие как 'en' и' es'? Что вы хотите сделать с 'q = 0.5'? Вы хотите проигнорировать это или выбросить ошибку? –
В случае плохо отформатированного заголовка я хочу, чтобы пользователь знал, но для обнаружения плохо отформатированного заголовка я предпочитаю не жестко кодировать правила – LetsPlayYahtzee
Тогда возникает вопрос, как выглядит «хороший» заголовок? Кому-то придется определять правила для правильно отформатированного заголовка, и вы можете использовать это правило для разбора заголовка. Если в какой-то момент заголовок не соответствует правилу, то он плохо отформатирован. 'q = 0,5' представляет собой вес, и он должен всегда появляться после языковой мнемоники. Вы могли бы использовать это как основное правило для следования –