You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					200 lines
				
				6.3 KiB
			
		
		
			
		
	
	
					200 lines
				
				6.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# set-cookie-parser 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[![NPM version][npm-image]][npm-url] 
							 | 
						||
| 
								 | 
							
								[![Build Status][travis-image]][travis-url] 
							 | 
						||
| 
								 | 
							
								[][npm-url]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parses set-cookie headers into objects
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Accepts a single `set-cookie` header value, an array of `set-cookie` header values, or a Node.js response object that may have 0 or more `set-cookie` headers.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Also accepts an optional options object. Defaults:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    decodeValues: true,  // Calls dcodeURIComponent on each value - default: true
							 | 
						||
| 
								 | 
							
								    map: false,          // Return an object instead of an array - default: false
							 | 
						||
| 
								 | 
							
								    silent: false,       // Suppress the warning that is loged 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 miliseconds.
							 | 
						||
| 
								 | 
							
								* `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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## 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
							 | 
						||
| 
								 | 
							
								[travis-image]: https://travis-ci.org/nfriedly/set-cookie-parser.svg?branch=master
							 | 
						||
| 
								 | 
							
								[travis-url]: https://travis-ci.org/nfriedly/set-cookie-parser
							 |