1

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);
};

connect/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 ヘッダー」エラーを返しているため、これについて明確にしたかっただけです。

Connect.js 経由で無効な Set-Cookie ヘッダーを設定する ExpressJS はありますか?

4

1 に答える 1

2

末尾の半色は、追加の属性と値のペアが存在する場合にのみ必要です。表記「*(";" cookie-av)」は、0回以上の出現を示します→セミコロンは、のすべての追加値にのみ必要ですcookie-av

仕様から:

非公式には、Set-Cookie応答ヘッダーは、トークンSet-Cookie:と、それに続く1つ以上のCookieのコンマ区切りリストで構成されます。各Cookieは、NAME = VALUEのペアで始まり、その後にセミコロンで区切られた0個以上の属性と値のペアが続きます。属性と値のペアの構文は前に示しました。

厳密に言えば、仕様に従わないのは、各セミコロンの後にエクスプレスによって挿入される余分なスペースです。私は、すべての正気のブラウザが非標準の余分な空白を処理する方法を知っているとはいえ、かなり自信を持っています。

于 2012-10-18T17:36:14.727 に答える