我想解析 Accept-Language
header 。我找到的所有答案都涉及解析字符串,但不处理输入格式错误的情况。
例如,如果用户发送此 header Accept-Language: en,es;q=0.5;*;q=0.5
由于第二个 ;< 而格式错误怎么办?/
。是否有任何包可以提供简单的解析和适当的异常引发?
最佳答案
首先,您应该了解 Accept-Language
header 的正确格式: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 ) ) | "*" )
正确格式 header 的示例是:Accept-Language: da, en-gb;q=0.8, en;q=0.7
。可以看到每个逗号,
分隔语言元组,其中每个语言元组是language-range
和quality weight
(可选)。
既然您知道了 Accept-Language
header 是如何定义的,那么唯一的问题就是如何解析它。
您可以根据语言以多种方式实现它,但我将编写一个伪代码:
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
请注意,根据语言处理错误的方式不同。
关于python - 检测格式错误的 Accept-Language HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101027/