【问题标题】:Is my Python3 HTTP header parsing code OK?我的 Python3 HTTP 标头解析代码可以吗?
【发布时间】:2014-11-05 19:55:57
【问题描述】:

我在 Python3 中编写了一个简短的函数来解析 HTTP 标头。我想知道是否有人能够看一下它并告诉我是否有什么我可以做的不同的事情来使代码更好。我目前所产生的结果是所需的结果,但我不确定是否会出现此代码无法产生所需结果的情况。

这就是我所拥有的:

def _parse_headers(self, headers):
  lines = headers.split("\r\n")
  info = lines[0].split(" ")

  method = None
  path = None
  protocol = None
  headers = {}

  if len(info) > 0:
    method = info[0]
  if len(info) > 1:
    path = info[1]
  if len(info) > 2:
    protocol = info[2]

  for line in lines[1:]:
    if line:
      parts = line.split(":")
      key = None
      value = None
      if len(parts) > 0:
        key = parts[0]
      if len(parts) > 1:
        value = parts[1]
      if not key is None and not value is None:
        headers[key.strip().upper()] = value.strip()

  return {
    "method": method,
    "path": path,
    "protocol": protocol,
    "headers": headers
  }

【问题讨论】:

  • This answer 提供了一种使用标准库中的方法解析标头的好方法。使用它而不是滚动您自己的代码。
  • 我可以在这里看到一些问题。这不能正确处理跨多行的标题,也不能正确处理其值包含 : 字符的标题。还有只识别\r\n 换行符的问题,虽然\n 换行符不是严格符合的,你应该明确接受或拒绝它们。
  • 我同意其他建议使用现有解析库的发帖人。但是,如果您确实想“自己动手”,则可以使用以下 hack 消除三重 if 构造:method, path, protocol = (info + 3*[None])[:3]。但它 hack。 :)

标签: python parsing http web python-3.4


【解决方案1】:

正如 André 在 cmets 中所指出的,解析 HTTP 不能掉以轻心,除非作为练习。在实际程序中,如果可能,您通常应该坚持现有的、成熟的实现。

请注意,除了整个消息结构之外,每个标头都有自己独特的内部结构,您通常也需要对其进行解析; Werkzeug可以help there

您的代码明显的具体问题是:

  • 给定一个标头 Host: www.example.com:80,它将返回 www.example.com 作为其值;
  • 给定多个同名标头,它只会返回最后一个的值。

【讨论】:

猜你喜欢
  • 2012-01-09
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2014-09-25
相关资源
最近更新 更多