我的Python3 HTTP头解析代码正常吗?

我的Python3 HTTP头解析代码正常吗?,python,parsing,http,web,python-3.4,Python,Parsing,Http,Web,Python 3.4,我用Python3编写了一个短函数来解析HTTP头。我想知道是否有人能看一下它,并告诉我是否有什么我可以做的不同,使代码更好。我目前所做的工作产生了所需的结果,但我不确定是否有任何情况下该代码不会产生所需的结果 这就是我所拥有的: def _parse_headers(self, headers): lines = headers.split("\r\n") info = lines[0].split(" ") method = None path = None proto

我用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
  }

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

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

代码中明显的特定问题有:

  • 给定一个头
    Host:www.example.com:80
    ,它将返回
    www.example.com
    作为其值
  • 给定具有相同名称的多个头,它将只返回最后一个头的值

提供了一种使用标准库中的方法解析标题的好方法。使用它而不是滚动你自己的代码。我可以在这里看到一些问题。这无法正确处理跨多行的标题,也无法正确处理其值包含
字符的标题。还有一个问题是只识别
\r\n
换行符,虽然
\n
换行符不是严格一致的,但您应该明确接受或拒绝它们。我同意其他海报建议使用现有解析库。但是如果你真的想“自己滚”,你可以用这个技巧消除三重
if
结构:
方法,路径,协议=(info+3*[None])[:3]
。但这是一种恶作剧我已经修正了第一个要点,但对于第二个要点,我将如何解决这个问题?@TechnoCF使用类似的数据结构,因为这是这种消息格式的起源。