在Cocoa中,在CFHTTPMessageCopyAllHeaderFields()
上调用CFHTTPMessageRef
会返回CFDictionaryRef
。这表明标题字段存储在CFDictionaryRef
的{{1}}中。因此,使用具有相同密钥的CFHTTPMessageRef
(“Set-Cookie”)将覆盖该密钥的任何先前值,只留下最后一个(并且使用此方法确实在客户端浏览器中设置了最后一个cookie通过套接字将CFHTTPMessageSetHeaderFieldValue()
数据返回给客户端)。有了这个限制,我们如何使用CFHTTPMessageRef
设置多个Cookie?
答案 0 :(得分:0)
由于CFHTTPMessageRef
确实将标头存储在可变CFDictionaryRef
中,因此使用CFHTTPMessageRef
设置多个Cookie确实不是很好的方法。您可以使用逗号分隔符为每个cookie折叠它们,虽然这似乎对我没用。做了什么工作是为Set-Cookie标头放置一个占位符,然后在发送从CFHTTPMessageRef
派生的数据之前,将数据转换为字符串并为每个cookie添加单独的Set-Cookie标头(替换占位符)使用CFHTTPMessageSetHeaderFieldValue()
。只有当主体有效负载是字符串时才有效。如果是二进制数据(如图像),则需要执行其他步骤以确保维护数据。
显然,这是CFHTTPMessageRef
的已知问题,因为它不符合最新的HTTP规范:rdar://15933483,