最近我一直在处理HTTP头。基于RFC规定的冒号分隔符,我正在解析HTTP头请求中的字段和值。在Python中:
header_request_line.split(":")
然而,如果在值字段中允许冒号,则会出现混乱。考虑以下情况:
User-Agent: Mozilla:4.0
这将被分成3个字符串,而不是我想要的2个。
最近我一直在处理HTTP头。基于RFC规定的冒号分隔符,我正在解析HTTP头请求中的字段和值。在Python中:
header_request_line.split(":")
User-Agent: Mozilla:4.0
这将被分成3个字符串,而不是我想要的2个。
是的。所以您可以执行类似于这样的操作(伪代码):
header = "User-Agent: Mozilla:4.0"
headerParts = header.split(":")
key = headerParts[0]
value = headerParts.substring(key.length).trim()
// or
value = headerParts.skip(1).join(":")
但是,当解析来自不同服务器的标头时,您可能会遇到各种问题,那么为什么不使用一个库呢?
在你的例子中,你可以简单地使用带有指定maxsplit参数的分割方法(split):
header_request_line.split(":", 1)
In [2]: 'User-Agent: Mozilla:4.0'.split(':', 1)
Out[2]: ['User-Agent', ' Mozilla:4.0']
User-Agent: Mozilla:4.0
这个值由两个标记(Mozilla,4.0)用冒号分隔组成。
虽然没有人特别要求,但是在我看来,使用冒号或带引号的字符串都可以,但在头部值中使用JSON字符串感觉风格不太好。
My-Header: {"foo":"bar","prop2":12345}
可能可以正常工作,但它不符合RFC7230第3.2.6节的意图。具体来说,{ ",:都是分隔符...其中一些在此JSON中是连续的。符合RFC7230的HTTP标头值的通用解析器将无法处理该值。如果您的系统需要该值,则更好的想法可能是对该值进行URL编码。
My-Header: %7B%22foo%22%3A%22bar%22%2C%22prop2%22%3A12345%7D
但在大多数情况下,这可能会过度杀伤力。你可以安全地将JSON插入HTTP头值中。