File size: 6,944 Bytes
bc20498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# set-cookie-parser 

[![Node.js CI](https://github.com/nfriedly/set-cookie-parser/actions/workflows/node.js.yml/badge.svg)](https://github.com/nfriedly/set-cookie-parser/actions/workflows/node.js.yml)
[![NPM version][npm-image]][npm-url] 
[![npm downloads](https://img.shields.io/npm/dm/set-cookie-parser)][npm-url]

Parses set-cookie headers into 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:

```js

{

    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` - cookie path (string or undefined)
* `domain` - domain for the cookie (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 max age of the cookie in seconds from when the client receives it (integer or undefined)
  * Note: when using with [express's res.cookie() method](http://expressjs.com/en/4x/api.html#res.cookie), multiply `maxAge` by 1000 to convert to milliseconds.
* `secure` - indicates that this cookie should only be sent over HTTPs (true or undefined)
* `httpOnly` - indicates that this cookie should *not* be accessible to client-side JavaScript (true or undefined)
* `sameSite` - indicates a cookie ought not to be sent along with cross-site requests (string or undefined)

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

## Install

```sh

$ npm install --save set-cookie-parser

```


## Usage

### Get array of cookie objects

```js

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:

```js

[

    {

        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'

    }

]

```

### Get map of cookie objects

```js

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:
```js

{

    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'

    }

}

```

### Creating a new, modified set-cookie header

This library can be used in conjunction with the [cookie](https://www.npmjs.com/package/cookie) library to modify and replace set-cookie headers:

```js

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](https://github.com/nfriedly/node-unblocker/blob/08a89ec27274b46dcd80d0a324a59406f2bdad3d/lib/cookies.js#L67-L85)

## 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.

```js

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()`.

## V2 Changes

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

## References

* [RFC 6265: HTTP State Management Mechanism](https://tools.ietf.org/html/rfc6265)
* [draft-ietf-httpbis-rfc6265bis-10](https://httpwg.org/http-extensions/draft-ietf-httpbis-rfc6265bis.html)

## License

MIT © [Nathan Friedly](http://www.nfriedly.com/)


[npm-image]: https://badge.fury.io/js/set-cookie-parser.svg
[npm-url]: https://npmjs.org/package/set-cookie-parser