HTTP头部字段值中可以包含冒号吗?

6

最近我一直在处理HTTP头。基于RFC规定的冒号分隔符,我正在解析HTTP头请求中的字段和值。在Python中:

header_request_line.split(":")

然而,如果在值字段中允许冒号,则会出现混乱。考虑以下情况:
User-Agent: Mozilla:4.0

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

3个回答

4
是的。因此,您可以执行类似于以下内容的操作(伪代码):

是的。所以您可以执行类似于这样的操作(伪代码):

header = "User-Agent: Mozilla:4.0"
headerParts = header.split(":")

key = headerParts[0]
value = headerParts.substring(key.length).trim()

// or
value = headerParts.skip(1).join(":")

但是,当解析来自不同服务器的标头时,您可能会遇到各种问题,那么为什么不使用一个库呢?


你有什么建议的库吗?我的输入是一个字符串格式的单个头文件。 - jeffrey
1
我不太熟悉Python的库,建议查看解析原始HTTP标头 - CodeCaster
谢谢,Brandon Rhodes有一个完美的解决方案。不幸的是,我需要知道HTTP头字段的顺序,而他的解决方案使用了字典。你有任何关于如何获取顺序的想法吗? - jeffrey

2

可以的

在你的例子中,你可以简单地使用带有指定maxsplit参数的分割方法(split):

header_request_line.split(":", 1)

它将产生以下结果,并且可以正常工作,尽管字段值中有多少个冒号:
In [2]: 'User-Agent: Mozilla:4.0'.split(':', 1)
Out[2]: ['User-Agent', ' Mozilla:4.0']

1
根据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} 

可能可以正常工作,但它不符合RFC7230第3.2.6节的意图。具体来说,{ ",:都是分隔符...其中一些在此JSON中是连续的。符合RFC7230的HTTP标头值的通用解析器将无法处理该值。如果您的系统需要该值,则更好的想法可能是对该值进行URL编码。

My-Header: %7B%22foo%22%3A%22bar%22%2C%22prop2%22%3A12345%7D

但在大多数情况下,这可能会过度杀伤力。你可以安全地将JSON插入HTTP头值中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接