python - 检测格式错误的 Accept-Language HTTP header

标签 python http http-headers python-3.5

我想解析 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-rangequality 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/

相关文章:

python - Django Heroku 推送失败

python - 我如何完成以下检查 list 中的第 2 项和/或完成该计划?

python - 在 Ubuntu 中为 weasyprint 安装最新的 cairo lib

http - 在字符集方面使用#form# 和#getHttpRequestData()# 有什么区别?

http - 在 root 和 rest on/api 上提供静态内容

Java 11 HttpClient 不发送基本身份验证

c# - 如何在.NET core 2.0服务中设置响应头

python - View 中的 Django api 调用无法保存外键 userId

http - Dropwizard - 设置自定义变化 header

php - "application/json"类型阻止发送后变量