HTTP标头请求可以在字段值中包含冒号吗?

时间:2014-11-14 22:12:20

标签: http http-headers rfc

我最近一直在使用HTTP标头。我正在根据RFC规定的冒号分析来解析来自HTTP头请求的字段和值。在python:

header_request_line.split(":")

但是,如果值字段中允许使用冒号,则会出现混乱。考虑:

User-Agent: Mozilla:4.0

将被分成3个字符串,而不是我想要的2个字符串。

3 个答案:

答案 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,答案是肯定的。 enter image description here

标头值是{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标头值插入。

相关问题