From c9459b19ba3dac0b2ab7a6c4e6b7d8a0a40c7378 Mon Sep 17 00:00:00 2001 From: Jonatan Nilsson Date: Tue, 8 Oct 2019 18:44:33 +0000 Subject: [PATCH] Remove cookies, replace debug with debug-ms --- docs/api/context.md | 23 -------- docs/api/index.md | 21 ------- docs/guide.md | 2 +- lib/application.js | 4 +- lib/context.js | 17 ------ lib/response.js | 16 ++--- package.json | 6 +- test/application/index.js | 6 -- test/context/cookies.js | 119 -------------------------------------- 9 files changed, 12 insertions(+), 202 deletions(-) delete mode 100644 test/context/cookies.js diff --git a/docs/api/context.md b/docs/api/context.md index 55c9e19..e30832a 100644 --- a/docs/api/context.md +++ b/docs/api/context.md @@ -66,29 +66,6 @@ ctx.state.user = await User.find(id); Koa applications extend an internal [EventEmitter](https://nodejs.org/dist/latest-v11.x/docs/api/events.html). `ctx.app.emit` emits an event with a type, defined by the first argument. For each event you can hook up "listeners", which is a function that is called when the event is emitted. Consult the [error handling docs](https://koajs.com/#error-handling) for more information. -### ctx.cookies.get(name, [options]) - - Get cookie `name` with `options`: - - - `signed` the cookie requested should be signed - -Koa uses the [cookies](https://github.com/pillarjs/cookies) module where options are simply passed. - -### ctx.cookies.set(name, value, [options]) - - Set cookie `name` to `value` with `options`: - - - `maxAge` a number representing the milliseconds from Date.now() for expiry - - `signed` sign the cookie value - - `expires` a `Date` for cookie expiration - - `path` cookie path, `'/'` by default - - `domain` cookie domain - - `secure` secure cookie - - `httpOnly` server-accessible cookie, __true__ by default - - `overwrite` a boolean indicating whether to overwrite previously set cookies of the same name (__false__ by default). If this is true, all cookies set during the same request with the same name (regardless of path or domain) are filtered out of the Set-Cookie header when setting this cookie. - -Koa uses the [cookies](https://github.com/pillarjs/cookies) module where options are simply passed. - ### ctx.throw([status], [msg], [properties]) Helper method to throw an error with a `.status` property diff --git a/docs/api/index.md b/docs/api/index.md index 010d4d4..fe0a573 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -112,7 +112,6 @@ app.listen(3000); the following are supported: - `app.env` defaulting to the __NODE_ENV__ or "development" - - `app.keys` array of signed cookie keys - `app.proxy` when true proxy header fields will be trusted - `app.subdomainOffset` offset of `.subdomains` to ignore [2] @@ -176,26 +175,6 @@ https.createServer(app.callback()).listen(3001); Add the given middleware function to this application. See [Middleware](https://github.com/koajs/koa/wiki#middleware) for more information. -## app.keys= - - Set signed cookie keys. - - These are passed to [KeyGrip](https://github.com/crypto-utils/keygrip), - however you may also pass your own `KeyGrip` instance. For - example the following are acceptable: - -```js -app.keys = ['im a newer secret', 'i like turtle']; -app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256'); -``` - - These keys may be rotated and are used when signing cookies - with the `{ signed: true }` option: - -```js -ctx.cookies.set('name', 'tobi', { signed: true }); -``` - ## app.context `app.context` is the prototype from which `ctx` is created. diff --git a/docs/guide.md b/docs/guide.md index 77c0a6f..d4fe2d4 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -209,7 +209,7 @@ app.use(async function (ctx, next) { ## Debugging Koa - Koa along with many of the libraries it's built with support the __DEBUG__ environment variable from [debug](https://github.com/visionmedia/debug) which provides simple conditional logging. + Koa along with many of the libraries it's built with support the __DEBUG__ environment variable from [debug](https://github.com/nfp-projects/debug-ms) which provides simple conditional logging. For example to see all Koa-specific debugging information just pass `DEBUG=koa*` and upon boot you'll see the list of middleware used, among other things. diff --git a/lib/application.js b/lib/application.js index 098ecb1..9caeb0e 100644 --- a/lib/application.js +++ b/lib/application.js @@ -6,7 +6,7 @@ */ const isGeneratorFunction = require('is-generator-function'); -const debug = require('debug')('koa:application'); +const debug = require('debug-ms')('koa:application'); const onFinished = require('on-finished'); const response = require('./response'); const compose = require('koa-compose'); @@ -38,7 +38,6 @@ module.exports = class Application extends Emitter { * * @param {object} [options] Application options * @param {string} [options.env='development'] Environment - * @param {string[]} [options.keys] Signed cookie keys * @param {boolean} [options.proxy] Trust proxy headers * @param {number} [options.subdomainOffset] Subdomain offset * @@ -50,7 +49,6 @@ module.exports = class Application extends Emitter { this.proxy = options.proxy || false; this.subdomainOffset = options.subdomainOffset || 2; this.env = options.env || process.env.NODE_ENV || 'development'; - if (options.keys) this.keys = options.keys; this.middleware = []; this.context = Object.create(context); this.request = Object.create(request); diff --git a/lib/context.js b/lib/context.js index dd54483..696aa79 100644 --- a/lib/context.js +++ b/lib/context.js @@ -10,9 +10,6 @@ const createError = require('http-errors'); const httpAssert = require('http-assert'); const delegate = require('delegates'); const statuses = require('statuses'); -const Cookies = require('cookies'); - -const COOKIES = Symbol('context#cookies'); /** * Context prototype. @@ -156,20 +153,6 @@ const proto = module.exports = { this.length = Buffer.byteLength(msg); res.end(msg); }, - - get cookies() { - if (!this[COOKIES]) { - this[COOKIES] = new Cookies(this.req, this.res, { - keys: this.app.keys, - secure: this.request.secure - }); - } - return this[COOKIES]; - }, - - set cookies(_cookies) { - this[COOKIES] = _cookies; - } }; /** diff --git a/lib/response.js b/lib/response.js index 415b830..5b2a3c6 100644 --- a/lib/response.js +++ b/lib/response.js @@ -316,21 +316,21 @@ module.exports = { type += '; charset=utf-8' } this.set('Content-Type', type); - } else if (type.indexOf('json')) { + } else if (type.indexOf('json') >= 0 || type.indexOf('css.map') >= 0 || type.indexOf('js.map') >= 0) { this.set('Content-Type', 'application/json; charset=utf-8'); - } else if (type.indexOf('html') => 0) { + } else if (type.indexOf('html') >= 0) { this.set('Content-Type', 'text/html; charset=utf-8'); - } else if (type.indexOf('css') => 0) { + } else if (type.indexOf('css') >= 0) { this.set('Content-Type', 'text/css; charset=utf-8'); - } else if (type.indexOf('js') => 0 || type.indexOf('javascript') => 0) { + } else if (type.indexOf('js') >= 0 || type.indexOf('javascript') >= 0) { this.set('Content-Type', 'application/javascript; charset=utf-8'); - } else if (type.indexOf('png') => 0) { + } else if (type.indexOf('png') >= 0) { this.set('Content-Type', 'image/png'); - } else if (type.indexOf('jpg') => 0) { + } else if (type.indexOf('jpg') >= 0) { this.set('Content-Type', 'image/jpeg'); - } else if (type.indexOf('jpeg') => 0) { + } else if (type.indexOf('jpeg') >= 0) { this.set('Content-Type', 'image/jpeg'); - } else if (type.indexOf('gif') => 0) { + } else if (type.indexOf('gif') >= 0) { this.set('Content-Type', 'image/gif'); } else if (type.indexOf('text')) { this.set('Content-Type', 'text/plain; charset=utf-8'); diff --git a/package.json b/package.json index 56b2c4b..1912624 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,8 @@ ], "license": "MIT", "dependencies": { - "content-disposition": "jharrilim/content-disposition#572383f -", - "cookies": "~0.7.1", - "debug": "~3.1.0", + "content-disposition": "jharrilim/content-disposition#572383f", + "debug-ms": "~4.1.2", "delegates": "^1.0.0", "depd": "^1.1.2", "destroy": "^1.0.4", diff --git a/test/application/index.js b/test/application/index.js index ff27111..ba3a5e0 100644 --- a/test/application/index.js +++ b/test/application/index.js @@ -66,12 +66,6 @@ describe('app', () => { assert.strictEqual(app.proxy, proxy); }); - it('should set signed cookie keys from the constructor', () => { - const keys = ['customkey']; - const app = new Koa({ keys }); - assert.strictEqual(app.keys, keys); - }); - it('should set subdomainOffset from the constructor', () => { const subdomainOffset = 3; const app = new Koa({ subdomainOffset }); diff --git a/test/context/cookies.js b/test/context/cookies.js deleted file mode 100644 index 4644f37..0000000 --- a/test/context/cookies.js +++ /dev/null @@ -1,119 +0,0 @@ - -'use strict'; - -const assert = require('assert'); -const request = require('supertest'); -const Koa = require('../..'); - -describe('ctx.cookies', () => { - describe('ctx.cookies.set()', () => { - it('should set an unsigned cookie', async() => { - const app = new Koa(); - - app.use((ctx, next) => { - ctx.cookies.set('name', 'jon'); - ctx.status = 204; - }); - - const server = app.listen(); - - const res = await request(server) - .get('/') - .expect(204); - - const cookie = res.headers['set-cookie'].some(cookie => /^name=/.test(cookie)); - assert.equal(cookie, true); - }); - - describe('with .signed', () => { - describe('when no .keys are set', () => { - it('should error', () => { - const app = new Koa(); - - app.use((ctx, next) => { - try { - ctx.cookies.set('foo', 'bar', { signed: true }); - } catch (err) { - ctx.body = err.message; - } - }); - - return request(app.callback()) - .get('/') - .expect('.keys required for signed cookies'); - }); - }); - - it('should send a signed cookie', async() => { - const app = new Koa(); - - app.keys = ['a', 'b']; - - app.use((ctx, next) => { - ctx.cookies.set('name', 'jon', { signed: true }); - ctx.status = 204; - }); - - const server = app.listen(); - - const res = await request(server) - .get('/') - .expect(204); - - const cookies = res.headers['set-cookie']; - - assert.equal(cookies.some(cookie => /^name=/.test(cookie)), true); - assert.equal(cookies.some(cookie => /(,|^)name\.sig=/.test(cookie)), true); - }); - }); - - describe('with secure', () => { - it('should get secure from request', async() => { - const app = new Koa(); - - app.proxy = true; - app.keys = ['a', 'b']; - - app.use(ctx => { - ctx.cookies.set('name', 'jon', { signed: true }); - ctx.status = 204; - }); - - const server = app.listen(); - - const res = await request(server) - .get('/') - .set('x-forwarded-proto', 'https') // mock secure - .expect(204); - - const cookies = res.headers['set-cookie']; - assert.equal(cookies.some(cookie => /^name=/.test(cookie)), true); - assert.equal(cookies.some(cookie => /(,|^)name\.sig=/.test(cookie)), true); - assert.equal(cookies.every(cookie => /secure/.test(cookie)), true); - }); - }); - }); - - describe('ctx.cookies=', () => { - it('should override cookie work', async() => { - const app = new Koa(); - - app.use((ctx, next) => { - ctx.cookies = { - set(key, value){ - ctx.set(key, value); - } - }; - ctx.cookies.set('name', 'jon'); - ctx.status = 204; - }); - - const server = app.listen(); - - await request(server) - .get('/') - .expect('name', 'jon') - .expect(204); - }); - }); -});