HTTP Headers Return 是什么格式?
What Format Do HTTP Headers Return As?
我一直在尝试对 HTTP 响应 header 进行单元测试。我需要从 header 接收一个 cookie。我得到了两个 Set-Cookie
headers,但我需要一个用于身份验证。返回的 header 是:
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
。我假设是因为我把 headers 放在字典里了。但是当我在我的单元测试中存根响应时,headers 所需的格式是字典。我只得到一个 Set-Cookie
header 因为我不能在字典中有两个相同的键。
我做错了什么吗?
RFC 7230, Section 3.2.2 涵盖了应该如何处理 HTTP headers;它取代了 RFC 2616。特别是,它说:
A sender MUST NOT generate multiple header fields with the same field
name in a message unless either the entire field value for that header
field is defined as a comma-separated list [i.e., #(values)] or the
header field is a well-known exception (as noted below).
而且,不幸的是,对于您的用例,Set-Cookie
是 那些著名的“well-known 异常”之一,因为它的语法(由 RFC 6265) 不容易加入 comma-separated cookie 值列表。
这意味着使用 dictionary/hashtable 结构来表示 HTTP headers 通常 有效,但在 Set-Cookie
这样的情况下会中断。还有其他获取 headers 的方法;例如,参见 this Whosebug post。或者,如果您可以针对 headers other 而不是 Set-Cookie
进行单元测试,那可能是另一种方法。
希望对您有所帮助!
我一直在尝试对 HTTP 响应 header 进行单元测试。我需要从 header 接收一个 cookie。我得到了两个 Set-Cookie
headers,但我需要一个用于身份验证。返回的 header 是:
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
。我假设是因为我把 headers 放在字典里了。但是当我在我的单元测试中存根响应时,headers 所需的格式是字典。我只得到一个 Set-Cookie
header 因为我不能在字典中有两个相同的键。
我做错了什么吗?
RFC 7230, Section 3.2.2 涵盖了应该如何处理 HTTP headers;它取代了 RFC 2616。特别是,它说:
A sender MUST NOT generate multiple header fields with the same field name in a message unless either the entire field value for that header field is defined as a comma-separated list [i.e., #(values)] or the header field is a well-known exception (as noted below).
而且,不幸的是,对于您的用例,Set-Cookie
是 那些著名的“well-known 异常”之一,因为它的语法(由 RFC 6265) 不容易加入 comma-separated cookie 值列表。
这意味着使用 dictionary/hashtable 结构来表示 HTTP headers 通常 有效,但在 Set-Cookie
这样的情况下会中断。还有其他获取 headers 的方法;例如,参见 this Whosebug post。或者,如果您可以针对 headers other 而不是 Set-Cookie
进行单元测试,那可能是另一种方法。
希望对您有所帮助!