【发布时间】: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