【问题标题】:What Format Do HTTP Headers Return As?HTTP 标头返回的格式是什么?
【发布时间】:2017-01-11 01:56:54
【问题描述】:

我一直在尝试对 HTTP 响应标头进行单元测试。我需要从标头接收 cookie。我得到了两个 Set-Cookie 标头,但我需要一个用于身份验证。返回的标头是:

HTTP/1.1 200 OK
Server: Cowboy
Connection: close
Set-Cookie: heroku-session-affinity=ADaDaANoA24IARpRKtf///8HYgABgzdiAAJZ5WECbAAAAAJtAAAABXdlYi4ybQAAAAV3ZWIuMWpcXMFamSToBPxyiOHM7o5AwvVZ3g__; Version=1; Expires=Thu, 12-Jan-2017 01:45:27 GMT; Max-Age=86400; Domain=xxxxxxxx.xxxx.xx; Path=/; HttpOnly
X-Powered-By: Express
Vary: Origin
Access-Control-Allow-Credentials: true
Content-Type: application/json; charset=utf-8
Content-Length: 30914
Etag: W/"78c2-veX2kgrO3zh118nYsOP80A"
Set-Cookie: connect.sid=s%3Adl1_47SY9vlKlHOguBvjZpmaa2WTUhHG.O2j9YOShB4AX0rAC5RRj%2BeCXAB11s5q1DB4x4fiHE4A; Path=/; Expires=Fri, 13 Jan 2017 01:45:27 GMT; HttpOnly
Date: Wed, 11 Jan 2017 01:45:27 GMT
Via: 1.1 vegur

我添加了一个包含这些值的测试文件:

{
    "Server": "Cowboy",
    "Connection": "close",
    "Set-Cookie": "heroku-session-affinity=ADaDaANoA24IAXtpQOD///8HYgAAKehiAA6V12ECbAAAAAJtAAAABXdlYi4ybQAAAAV3ZWIuMWrNqkap0u4H0uG3Btrtlamaq2nQ5w__; Version=1; Expires=Wed, 11-Jan-2017 01:12:09 GMT; Max-Age=86400; Domain=xxxxxxxx.xxxx.xx; Path=/; HttpOnly",
    "X-Powered-By": "Express",
    "Vary": "Origin",
    "Access-Control-Allow-Credentials": "true",
    "Content-Type": "application/json; charset=utf-8",
    "Content-Length": "30914",
    "Etag": "W/\"78c2-veX2kgrO3zh118nYsOP80A\"",
    "Set-Cookie": "connect.sid=s%3ACX3tfhPk9nlRtU8e8gtouQIx1kpP07h9.iExm%2F96Dgzuh289nmjwbYO49E0Bq0WwUHmN539IkudI; Path=/; Expires=Thu, 12 Jan 2017 01:12:09 GMT; HttpOnly",
    "Date": "Tue, 10 Jan 2017 01:12:09 GMT",
    "Via": "1.1 vegur"
}

我需要第二个Set-Cookie 值,但是当我尝试访问它的值时,我得到了第一个Set-Cookie。我假设是因为我将标题放在字典中。但是当我在单元测试中存根响应时,标题所需的格式是字典。我只得到一个 Set-Cookie 标头,因为字典中不能有两个相同的键。

我是不是做错了什么?

【问题讨论】:

    标签: http-headers nshttpurlresponse


    【解决方案1】:

    RFC 7230, Section 3.2.2 涵盖了应该如何处理 HTTP 标头;它取代了 RFC 2616。特别是,它说:

    发件人不得生成具有相同字段的多个标头字段 消息中的名称,除非该标头的整个字段值 字段被定义为逗号分隔的列表 [即 #(values)] 或 标头字段是一个众所周知的例外(如下所述)。

    而且,不幸的是,对于您的用例,Set-Cookie 那些著名的“众所周知的例外”之一,因为它的语法(由 RFC 6265 覆盖)并不适合以逗号分隔的 cookie 值列表。

    这意味着使用字典/哈希表结构来表示 HTTP 标头通常有效,但在 Set-Cookie 这样的情况下会中断。还有其他获取标头的方法;例如,参见this StackOverflow post。或者,如果您可以对Set-Cookie 以外的标头其他 进行单元测试,那可能是另一种方法。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2012-06-27
      • 1970-01-01
      • 2013-12-25
      • 2017-08-26
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多