ExpressJS使用无效的set-cookie标头吗?

时间:2012-10-18 16:41:50

标签: node.js http-headers express connect

我正在使用ExpressJS res.cookie功能向标头添加Cookie res.cookie('mycookie', x, y);

但是深入ExpressJS和Connect我发现用于cookie函数的参数字符串的连接并不附加一个尾随的分号

快递/ res.js

res.cookie = function(name, val, options){
  options = options || {};
  if ('maxAge' in options) options.expires = new Date(Date.now() + options.maxAge);
  if (undefined === options.path) options.path = this.app.set('basepath');
  var cookie = utils.serializeCookie(name, val, options);
  this.header('Set-Cookie', cookie);
};

连接/ utils.js

exports.serializeCookie = function(name, val, obj){
  var pairs = [name + '=' + encodeURIComponent(val)]
    , obj = obj || {};

  if (obj.domain) pairs.push('domain=' + obj.domain);
  if (obj.path) pairs.push('path=' + obj.path);
  if (obj.expires) pairs.push('expires=' + obj.expires.toUTCString());
  if (obj.httpOnly) pairs.push('httpOnly');
  if (obj.secure) pairs.push('secure');
  //this doesnt append semi colon
  return pairs.join('; ');
};

然后我查找了Set-Cookie标头(http://www.ietf.org/rfc/rfc2109.txt

的规范

Set-Cookie响应头的语法是

   set-cookie      =       "Set-Cookie:" cookies
   cookies         =       1#cookie
   cookie          =       NAME "=" VALUE *(";" cookie-av)
   NAME            =       attr
   VALUE           =       value
   cookie-av       =       "Comment" "=" value
                   |       "Domain" "=" value
                   |       "Max-Age" "=" value
                   |       "Path" "=" value
                   |       "Secure"
                   |       "Version" "=" 1*DIGIT

语言结构似乎意味着应该有一个尾随的分号。

我只是想明确这一点,因为我运行的一些解析器已经使用res.cookie()设置的cookie返回'无效的Set-Cookie标头'错误。

ExpressJS是否通过Connect.js设置无效的Set-Cookie标头?

1 个答案:

答案 0 :(得分:2)

仅当存在其他属性 - 值对时才需要尾随半色。符号“*(";" cookie-av)”表示零次或多次出现→只有cookie-av的每个附加值都需要分号。

来自规范:

  

非正式地,Set-Cookie响应头包含令牌   Set-Cookie:,后跟逗号分隔的一个或多个列表   饼干。每个cookie都以NAME = VALUE对开头,后跟零   或更多以分号分隔的属性 - 值对。的语法   属性值对显示在前面。

严格地说,根据规范不能进行的是每个分号后由express表示插入的额外空间。虽然每个理智的浏览器都知道如何处理非标准的额外空格,但我非常有信心。