Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

set-cookie-parser

nfriedly20.9mMIT2.7.1TypeScript support: definitely-typed

Parses set-cookie headers into objects

set-cookie, set, cookie, cookies, header, parse, parser

readme

set-cookie-parser

Node.js CI NPM version npm downloads


ℹ️ Note for current users: I'm considering some changes for the next major version and would appreciate your feedback: https://github.com/nfriedly/set-cookie-parser/discussions/68


Parses set-cookie headers into JavaScript objects

Accepts a single set-cookie header value, an array of set-cookie header values, a Node.js response object, or a fetch() Response object that may have 0 or more set-cookie headers.

Also accepts an optional options object. Defaults:

{
    decodeValues: true,  // Calls decodeURIComponent on each value - default: true
    map: false,          // Return an object instead of an array - default: false
    silent: false,       // Suppress the warning that is logged when called on a request instead of a response - default: false
}

Returns either an array of cookie objects or a map of name => cookie object with {map: true}. Each cookie object will have, at a minimum name and value properties, and may have additional properties depending on the set-cookie header:

  • name - cookie name (string)
  • value - cookie value (string)
  • path - URL path to limit the scope to (string or undefined)
  • domain - domain to expand the scope to (string or undefined, may begin with "." to indicate the named domain or any subdomain of it)
  • expires - absolute expiration date for the cookie (Date object or undefined)
  • maxAge - relative expiration time of the cookie in seconds from when the client receives it (integer or undefined)
  • secure - indicates cookie should only be sent over HTTPs (true or undefined)
  • httpOnly - indicates cookie should not be accessible to client-side JavaScript (true or undefined)
  • sameSite - indicates if cookie should be included in cross-site requests (more info) (string or undefined)
    • Note: valid values are "Strict", "Lax", and "None", but set-cookie-parser coppies the value verbatim and does not perform any validation.
  • partitioned - indicates cookie should be scoped to the combination of 3rd party domain + top page domain (more info) (true or undefined)

(The output format is loosely based on the input format of https://www.npmjs.com/package/cookie)

Install

$ npm install --save set-cookie-parser

Usage

var http = require('http');
var setCookie = require('set-cookie-parser');

http.get('http://example.com', function(res) {
  var cookies = setCookie.parse(res, {
    decodeValues: true  // default: true
  });

  cookies.forEach(console.log);
}

Example output:

[
    {
        name: 'bam',
        value: 'baz'
    },
    {
        name: 'foo',
        value: 'bar',
        path: '/',
        expires: new Date('Tue Jul 01 2025 06:01:11 GMT-0400 (EDT)'),
        maxAge: 1000,
        domain: '.example.com',
        secure: true,
        httpOnly: true,
        sameSite: 'lax'
    }
]
var http = require('http');
var setCookie = require('set-cookie-parser');

http.get('http://example.com', function(res) {
  var cookies = setCookie.parse(res, {
    decodeValues: true,  // default: true
    map: true            // default: false
  });

  var desiredCookie = cookies['session'];
  console.log(desiredCookie);
});

Example output:

{
    bam: {
        name: 'bam',
        value: 'baz'
    },
    foo: {
        name: 'foo',
        value: 'bar',
        path: '/',
        expires: new Date('Tue Jul 01 2025 06:01:11 GMT-0400 (EDT)'),
        maxAge: 1000,
        domain: '.example.com',
        secure: true,
        httpOnly: true,
        sameSite: 'lax'
    }
}

This library can be used in conjunction with the cookie library to modify and replace set-cookie headers:

const libCookie = require('cookie');
const setCookie = require('set-cookie-parser');

function modifySetCookie(res){
  // parse the set-cookie headers with this library
  let cookies = setCookie.parse(res);

  // modify the cookies here
  // ...

  // create new set-cookie headers using the cookie library
  res.headers['set-cookie'] = cookies.map(function(cookie) {
      return libCookie.serialize(cookie.name, cookie.value, cookie);
  });
}

See a real-world example of this in unblocker

Usage in React Native (and with some other fetch implementations)

React Native follows the Fetch spec more closely and combines all of the Set-Cookie header values into a single string. The splitCookiesString method reverses this.

var setCookie = require('set-cookie-parser');

var response = fetch(/*...*/);

// This is mainly for React Native; Node.js does not combine set-cookie headers.
var combinedCookieHeader = response.headers.get('Set-Cookie');
var splitCookieHeaders = setCookie.splitCookiesString(combinedCookieHeader)
var cookies = setCookie.parse(splitCookieHeaders);

console.log(cookies); // should be an array of cookies

This behavior may become a default part of parse in the next major release, but requires the extra step for now.

Note that the fetch() spec now includes a getSetCookie() method that provides un-combined Set-Cookie headers. This library will automatically use that method if it is present.

API

parse(input, [options])

Parses cookies from a string, array of strings, or a http response object. Always returns an array, regardless of input format. (Unless the map option is set, in which case it always returns an object.)

parseString(individualSetCookieHeader, [options])

Parses a single set-cookie header value string. Options default is {decodeValues: true}. Used under-the-hood by parse(). Returns an object.

splitCookiesString(combinedSetCookieHeader)

It's uncommon, but the HTTP spec does allow for multiple of the same header to have their values combined (comma-separated) into a single header. This method splits apart a combined header without choking on commas that appear within a cookie's value (or expiration date). Returns an array of strings that may be passed to parse().

References

License

MIT © Nathan Friedly

changelog

v2.7.1 - 2024-10-21

v2.7.0 - 2024-08-01

  • Added support for partitioned attribute
  • Set up automatic publishing to npm from github actions, with provenance

Docs:

  • Added changelog

v2.6.0 - 2023-05-18

  • Add support for getSetCookie() method on fetch response headers objects.

v2.5.1 - 2024-07-25

  • Change name-value-pair parsing to follow 6265bis
    • When there's no = in the "name=value" part, now the name is '' and the value is the entire string. Previously it was the other way around.

v2.5.0 - 2022-06-04

  • Add "sideEffects": false to package.json to help bundlers like Webpack and Rollup

v2.4.8 - 2021-02-26

  • Revert to ES5

v2.4.7 - 2021-01-16

  • Handle cases where decodeURIComponent() throws when decoding a value by logging an error and returning the original value
  • Switch to ES6

v2.4.6 - 2020-05-30

  • Return an empty object rather than an empty array for falsy input when options.map is enabled

v2.4.5 - 2020-04-04

  • Document new silent option
  • No functional changes

v2.4.4 - 2020-04-04

  • Log a warning if the library appears to have been used incorrectly on a request rather than on a response.
    • New silent option to suppress this behavior

v2.4.3 - 2020-01-29

  • Fix parseString export, add default options

v2.4.2 - 2020-01-29

  • Documentation improvements
  • No functional changes

v2.4.1 - 2019-12-13

  • Documentation improvements
  • No functional changes

v2.4.0 - 2019-08-15

  • Documented parse, parseString, & splitCookiesString methods
  • Attempted but failed to export parseString method
  • No functional changes

v2.3.8 - 2019-07-15

  • Drop testing on node < 8 due to ESLint
  • No functional changes

v2.3.7 - 2019-07-15 (unpublished)

  • Development dependency bump
  • No functional changes

v2.3.6 - 2019-07-15 (unpublished)

  • Support arbitrary capitalization of Set-Cookie header name for non-node.js environments

v2.3.5 - 2019-01-29

  • Clarify documentation of map option
  • No functional changes

v2.3.4 - 2019-01-28 (unpublished)

  • Fixed automated publishing to npm
  • No functional changes

v2.3.3 - 2019-01-28 (unpublished)

  • No functional changes

v2.3.2 - 2019-01-28 (unpublished)

  • No functional changes

v2.3.1 - 2019-01-28 (unpublished)

  • No functional changes

v2.3.0 - 2018-11-12 (unpublished)

  • New map option to return an Object with cookies keyed by name rather than an array of cookies

v2.2.1 - 2018-07-10

  • Revert to ES5

v2.2.0 - 2018-07-08

  • Add splitCookiesString to separate multiple comma-separated Set-Cookie headers
  • Changed code from ES5 to ES6

v2.1.2 - 2018-05-26

Docs

  • Fixed a broken link

v2.1.1 - 2018-02-26

  • Updated automated release script

v2.1.0 - 2018-02-26

Added

  • Support for SameSite attribute

v2.0.0 - 2016-12-13

  • Added decodeValues option (calls decodeURIComponent() on each cookie value), enabled by default.
  • Added splitCookiesString method.

v1.0.2 - 2016-02-08

Docs:

  • Update badges and keywords

v1.0.1 - 2015-07-01

Docs:

  • Added output example

v1.0.0 - 2015-07-01

Initial release