Remove cookies, replace debug with debug-ms

master
Jonatan Nilsson 2019-10-08 18:44:33 +00:00
parent 2ef7846b5f
commit c9459b19ba
9 changed files with 12 additions and 202 deletions

View File

@ -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

View File

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

View File

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

View File

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

View File

@ -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;
}
};
/**

View File

@ -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');

View File

@ -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",

View File

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

View File

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