我最近一直在使用HTTP标头。我正在根据RFC规定的冒号分析来解析来自HTTP头请求的字段和值。在python:
header_request_line.split(":")
但是,如果值字段中允许使用冒号,则会出现混乱。考虑:
User-Agent: Mozilla:4.0
将被分成3个字符串,而不是我想要的2个字符串。
答案 0 :(得分:3)
Yes。所以你可以做这样的事情(伪):
header = "User-Agent: Mozilla:4.0"
headerParts = header.split(":")
key = headerParts[0]
value = headerParts.substring(key.length).trim()
// or
value = headerParts.skip(1).join(":")
但是,在解析各种服务器的标头时,您可能会遇到各种问题,为什么不使用库呢?
答案 1 :(得分:1)
是的can
在您的示例中,您可以简单地使用以下指定的 maxsplit 参数进行拆分:
header_request_line.split(":", 1)
它将产生以下结果,并且尽管字段值中的冒号数量仍然有效:
In [2]: 'User-Agent: Mozilla:4.0'.split(':', 1)
Out[2]: ['User-Agent', ' Mozilla:4.0']
答案 2 :(得分:0)
对于每RFC 7230,答案是肯定的。
标头值是{token,quoted-string,comment}的组合,以分隔符分隔。分隔符可以是冒号。
所以标题是
User-Agent: Mozilla:4.0
的值包含两个用冒号分隔的标记(Mozilla,4.0)。
没有人特别问过这个问题,但是...我认为在冒号正常且带引号的字符串正常的情况下,使用JSON字符串作为标头值对我来说感觉不佳。
My-Header: {"foo":"bar","prop2":12345}
..可能会正常工作,但不符合sec的意图。 RFC7230的3.2.6。特别是{“,:是所有定界符...,并且其中一些在此JSON中是连续的。符合RFC7230的HTTP标头值的通用解析器对此值不满意。如果您的系统需要它,那么最好想法可能是对该值进行URL编码。
My-Header: %7B%22foo%22%3A%22bar%22%2C%22prop2%22%3A12345%7D
但是在大多数情况下,这可能会过分杀伤力。也许可以安全地将JSON作为HTTP标头值插入。