用于将单个HTTP标头的多个值添加到请求或响应的标准

jco*_*lin 59 http httpwebrequest http-headers

如果我想将值列表添加为HTTP标头,是否有标准方法可以执行此操作?我在RFC 822中找不到任何东西(我可以很容易理解).例如,逗号分隔值是标准值还是分号分隔值.有标准吗?

例:

Key: value1;value2;value3
Run Code Online (Sandbox Code Playgroud)

Mar*_*ski 86

您需要查看HTTP规范RFC 2616,其中说:

当且仅当该头字段的整个字段值被定义为以逗号分隔的列表[即,#(值)]时,具有相同字段名的多个消息头字段可以存在于消息中.必须可以将多个头字段组合成一个"字段名:字段 - 值"对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔.因此,接收具有相同字段名称的头字段的顺序对于组合字段值的解释是重要的,因此代理不能在转发消息时改变这些字段值的顺序.

这意味着您可以在具有不同值的响应中多次发送相同的标头,只要这些值可以使用逗号相互附加.这也意味着您可以通过使用逗号连接来在单个标头中发送多个值.

所以在你的情况下它将是:

Key: value1,value2,value3
Run Code Online (Sandbox Code Playgroud)

  • 您可以在具有不同值的响应中多次发送相同的标头*当且仅当该标头字段的整个字段值被定义为以逗号分隔的列表*时.我认为这指的是并非所有标题都被允许为一组值.例如,Content-Length必须是单个值. (8认同)

cep*_*3us 9

无论如何@ marc-novakowski你缩小了"问题":)

通常(根据HTTP规范)我们使用逗号','来界定其他值.

但我们将研究一个简单的案例:

Cookie-set: language=pl; expires=Sat, 15-Jul-2017 23:58:22 GMT; path=/; domain=x.com   
Cookie-set: id=123 expires=Sat, 15-Jul-2017 23:58:22 GMT; path=/; domain=x.com; httponly   
Run Code Online (Sandbox Code Playgroud)

如果用逗号分隔彼此的值,你如何加入这样的标题 - 当昏迷可以出现的情况???

然后"客户"的责任是选择并决定策略,例如drop,merg(如果merg如何)?

请看一下nsHttpHeaderArray的 Mozilla实现

https://github.com/bnoordhuis/mozilla-central/blob/master/netwerk/protocol/http/nsHttpHeaderArray.h#L185

在这种情况下,mozilla选择使用换行符分隔符'\n'(对于某些标题字段名称)

当你面对这种情况时,我鼓励你们寻找共同的现有解决方案 - 因为他们提供了熟悉的方案


Mar*_*anD 5

但是,并非所有具有相同字段名称的值都可以合并到字段值列表中。例如,在RFC 7230中,我们可以阅读

注意:实际上,“ Set-Cookie”头字段([RFC6265])通常在响应消息中出现多次,并且不使用列表语法,这违反了对同名多个头字段的上述要求。由于不能将其组合为单个字段值,因此收件人在处理标头字段时应处理“ Set-Cookie”作为特殊情况。(有关详细信息,请参见[Kri2001]的附录A.2.3。)