【发布时间】:2020-08-05 20:25:26
【问题描述】:
您可能知道,RFC 6265 表示允许有多个带有Set-Cookie 名称的标头。
但是,Fetch API 不允许这样做,因为其 Headers 接口公开的所有方法(包括 get()、set()、append()、entries() 和所有其他方法)都已实现将所有具有相同名称的标头的值合并为一个以逗号分隔的标头。
例如,如果我们这样做:
var headers = new Headers();
headers.append('content-type', 'text/plain');
headers.append('set-cookie', 'test1=v; Max-Age=0');
headers.append('set-cookie', 'test2=v; Max-Age=0');
headers.append('set-cookie', 'test3=v; Max-Age=0');
然后我们尝试使用get('set-cookie') 读取set-cookie 值,或者通过使用entries() 迭代headers 变量,我们得到:
'set-cookie' : test1=v; Max-Age=0, test2=v; Max-Age=0, test3=v; Max-Age=0
请注意,如果我们尝试读取或操作具有多个同名标头的现有响应对象(即由可能支持此类允许行为的其他框架创建)的现有响应对象,也会发生相同的错误行为:换句话说,似乎像Fetch API 完全无法正确处理这种情况。
现在,虽然某些标头(例如 Accept)需要这种行为,但大多数浏览器(包括 Chrome 和 Firefox)都无法正确解析 Set-Cookie 标头,从而导致未正确设置 cookie。
这是一个已知的错误吗?如果是这种情况,是否有可用的解决方法来克服这个问题?
【问题讨论】:
-
我相信这是唯一一个不允许像这样合并的 HTTP 标头。所以我对这个案子没有被考虑并不完全感到震惊。迭代标题时是否会获得单独的条目(使用
.entries()) -
@Evert 不,正如我上面解释的那样,所有这些方法都将返回合并为一个的值,而不管响应对象实际包含什么。换句话说,您总是得到一个(合并的)Set-Cookie 条目。
-
Set-Cookie由服务器发送,而不是客户端发送。为什么在 Fetch API 中需要它? -
@Barmar 我开发了一个 CORS 代理,可以将请求转发到上游并响应客户端,因此我必须以各种方式处理 HTTP 响应。如果您有兴趣,请私信我,我会发送详细信息,但请相信我 - 我肯定需要这个答案。
-
如果您想尝试获得赏金,here 是我需要修复/解决方法的代码(第 240 行及以下)。阅读 cmets 应该足以了解我遇到的问题以及我想获得什么。
标签: javascript cookies fetch fetch-api response-headers