Comparing version 16.4.3 to 16.5.0
@@ -538,4 +538,5 @@ 'use strict'; | ||
const count = (typeof credentials.scope === 'string' ? (scope[type].indexOf(credentials.scope) !== -1 ? 1 : 0) | ||
: Hoek.intersect(scope[type], credentials.scope).length); | ||
const count = typeof credentials.scope === 'string' ? | ||
(scope[type].indexOf(credentials.scope) !== -1 ? 1 : 0) : | ||
Hoek.intersect(scope[type], credentials.scope).length; | ||
@@ -542,0 +543,0 @@ if (type === 'forbidden') { |
@@ -105,3 +105,3 @@ 'use strict'; | ||
result.then(null, (err) => reply(err instanceof Error ? Boom.wrap(err) : Boom.badImplementation('Unhandled rejected promise', err))); | ||
result.then(null, (err) => reply(err instanceof Error ? Boom.boomify(err) : Boom.badImplementation('Unhandled rejected promise', err))); | ||
} | ||
@@ -108,0 +108,0 @@ }; |
@@ -29,2 +29,3 @@ 'use strict'; | ||
this.domain.on('error', this._onError.bind(this)); | ||
request.onPodiumError = (err) => this._onError(err); | ||
}; | ||
@@ -31,0 +32,0 @@ |
@@ -108,3 +108,3 @@ 'use strict'; | ||
const decoration = this._decorations[method]; | ||
reply[method] = (domain ? domain.bind(decoration) : decoration); | ||
reply[method] = (domain && typeof decoration === 'function') ? domain.bind(decoration) : decoration; | ||
} | ||
@@ -111,0 +111,0 @@ } |
@@ -19,3 +19,4 @@ 'use strict'; | ||
const internals = { | ||
properties: ['connection', 'server', 'url', 'query', 'path', 'method', 'mime', 'setUrl', 'setMethod', 'headers', 'id', 'app', 'plugins', 'route', 'auth', 'pre', 'preResponses', 'info', 'orig', 'params', 'paramsArray', 'payload', 'state', 'jsonp', 'response', 'raw', 'tail', 'addTail', 'domain', 'log', 'getLog', 'generateResponse'] | ||
properties: ['connection', 'server', 'url', 'query', 'path', 'method', 'mime', 'setUrl', 'setMethod', 'headers', 'id', 'app', 'plugins', 'route', 'auth', 'pre', 'preResponses', 'info', 'orig', 'params', 'paramsArray', 'payload', 'state', 'jsonp', 'response', 'raw', 'tail', 'addTail', 'domain', 'log', 'getLog', 'generateResponse'], | ||
emitter: new Podium(['finish', { name: 'peek', spread: true }, 'disconnect']) | ||
}; | ||
@@ -63,3 +64,3 @@ | ||
Podium.call(this, ['finish', { name: 'peek', spread: true }, 'disconnect']); | ||
Podium.decorate(this, internals.emitter); | ||
@@ -66,0 +67,0 @@ // Take measurement as soon as possible |
@@ -9,2 +9,3 @@ 'use strict'; | ||
const Podium = require('podium'); | ||
const Streams = require('./streams'); | ||
@@ -63,5 +64,5 @@ | ||
return (result instanceof Error ? Boom.wrap(result) | ||
: (result instanceof internals.Response ? result | ||
: new internals.Response(result, request))); | ||
return (result instanceof Error) ? | ||
Boom.boomify(result) : | ||
(result instanceof internals.Response ? result : new internals.Response(result, request)); | ||
}; | ||
@@ -473,3 +474,3 @@ | ||
if (source instanceof Error) { | ||
return next(Boom.wrap(source)); | ||
return next(Boom.boomify(source)); | ||
} | ||
@@ -491,6 +492,6 @@ | ||
err.data = source; | ||
return next(Boom.wrap(err)); | ||
return next(Boom.boomify(err)); | ||
} | ||
return next(Boom.wrap(source)); | ||
return next(Boom.boomify(source)); | ||
}; | ||
@@ -628,26 +629,18 @@ | ||
if (stream instanceof Stream) { | ||
if (stream.close) { | ||
stream.close(); | ||
} | ||
else if (stream.destroy) { | ||
stream.destroy(); | ||
} | ||
else { | ||
const read = () => { | ||
internals.Response.drain(stream); | ||
} | ||
}; | ||
stream.read(); | ||
}; | ||
const end = () => { | ||
internals.Response.drain = function (stream) { | ||
stream.removeListener('readable', read); | ||
stream.removeListener('error', end); | ||
stream.removeListener('end', end); | ||
}; | ||
stream.on('readable', read); | ||
stream.once('error', end); | ||
stream.once('end', end); | ||
} | ||
if (stream.close) { | ||
stream.close(); | ||
} | ||
else if (stream.destroy) { | ||
stream.destroy(); | ||
} | ||
else { | ||
Streams.drain(stream); | ||
} | ||
}; | ||
@@ -654,0 +647,0 @@ |
@@ -16,2 +16,3 @@ 'use strict'; | ||
const Schema = require('./schema'); | ||
const Streams = require('./streams'); | ||
@@ -233,3 +234,3 @@ | ||
if (this._special) { | ||
this._cycle = [Handler.execute]; | ||
this._cycle = [internals.drain, Handler.execute]; | ||
return; | ||
@@ -416,12 +417,30 @@ } | ||
const failAction = request.route.settings.payload.failAction; // failAction: 'error', 'log', 'ignore' | ||
if (failAction !== 'ignore') { | ||
request._log(['payload', 'error'], err); | ||
// failAction: 'error', 'log', 'ignore', function (request, reply, error) | ||
const failAction = request.route.settings.payload.failAction; | ||
if (failAction === 'ignore') { | ||
return next(); | ||
} | ||
if (failAction === 'error') { | ||
request._log(['payload', 'error'], err); | ||
// Log only | ||
if (failAction === 'log') { | ||
return next(); | ||
} | ||
// Return error | ||
if (typeof failAction !== 'function') { | ||
return next(err); | ||
} | ||
return next(); | ||
// Custom handler | ||
request._protect.run(next, (exit) => { | ||
const reply = request.server._replier.interface(request, request.route.realm, {}, exit); | ||
return failAction(request, reply, err); | ||
}); | ||
}; | ||
@@ -440,22 +459,17 @@ | ||
const stream = request.raw.req; | ||
Streams.drain(request.raw.req, () => { | ||
const read = () => { | ||
request._isPayloadPending = false; | ||
return onParsed(err, parsed); | ||
}); | ||
}); | ||
}; | ||
stream.read(); | ||
}; | ||
const end = () => { | ||
internals.drain = function (request, next) { | ||
stream.removeListener('readable', read); | ||
stream.removeListener('error', end); | ||
stream.removeListener('end', end); | ||
return Streams.drain(request.raw.req, () => { | ||
request._isPayloadPending = false; | ||
return onParsed(err, parsed); | ||
}; | ||
stream.on('readable', read); | ||
stream.once('error', end); | ||
stream.once('end', end); | ||
request._isPayloadPending = false; | ||
return next(); | ||
}); | ||
@@ -462,0 +476,0 @@ }; |
@@ -115,3 +115,6 @@ 'use strict'; | ||
uploads: Joi.string(), | ||
failAction: Joi.string().valid('error', 'log', 'ignore'), | ||
failAction: [ | ||
Joi.string().valid('error', 'log', 'ignore'), | ||
Joi.func() | ||
], | ||
timeout: Joi.number().integer().positive().allow(false), | ||
@@ -136,3 +139,3 @@ defaultContentType: Joi.string(), | ||
.without('modify', 'sample') | ||
.assert('options.stripUnknown', Joi.ref('modify'), 'meet requirement of having peer modify set to true'), | ||
.assert('options.stripUnknown', Joi.when('modify', { is: true, otherwise: Joi.forbidden() }), 'meet requirement of having peer modify set to true'), | ||
security: Joi.object({ | ||
@@ -139,0 +142,0 @@ hsts: [ |
@@ -85,8 +85,10 @@ 'use strict'; | ||
if (this._settings.debug.log) { | ||
this._events.on({ name: 'log', filter: this._settings.debug.log }, (event) => debug(null, event)); | ||
const filter = this._settings.debug.log.some((tag) => tag === '*') ? undefined : this._settings.debug.log; | ||
this._events.on({ name: 'log', filter }, (event) => debug(null, event)); | ||
} | ||
if (this._settings.debug.request) { | ||
this.on({ name: 'request', filter: this._settings.debug.request }, debug); | ||
this.on({ name: 'request-internal', filter: this._settings.debug.request }, debug); | ||
const filter = this._settings.debug.request.some((tag) => tag === '*') ? undefined : this._settings.debug.request; | ||
this.on({ name: 'request', filter }, debug); | ||
this.on({ name: 'request-internal', filter }, debug); | ||
} | ||
@@ -93,0 +95,0 @@ } |
@@ -82,3 +82,3 @@ 'use strict'; | ||
if (err) { | ||
return next(Boom.wrap(err)); | ||
return next(Boom.boomify(err)); | ||
} | ||
@@ -240,19 +240,16 @@ | ||
// Write payload | ||
// Injection | ||
let hasEnded = false; | ||
const end = (err, event) => { | ||
if (isInjection) { | ||
request.raw.res._hapi = { request }; | ||
if (hasEnded) { | ||
return; | ||
if (response.variety === 'plain') { | ||
request.raw.res._hapi.result = response._isPayloadSupported() ? response.source : null; | ||
} | ||
} | ||
hasEnded = true; | ||
// Write payload | ||
if (!request.raw.res.finished && | ||
event !== 'aborted') { | ||
const end = Hoek.once((err, event) => { | ||
request.raw.res.end(); | ||
} | ||
source.removeListener('error', end); | ||
@@ -267,6 +264,19 @@ | ||
const tags = (err ? ['response', 'error'] | ||
: (event ? ['response', 'error', event] | ||
: ['response'])); | ||
if (err) { | ||
request.raw.res.destroy(); | ||
if (request.raw.res._hapi) { | ||
request.raw.res._hapi.result = Boom.boomify(err).output.payload; // Force injected response to error | ||
} | ||
source.unpipe(); | ||
Response.drain(source); | ||
} | ||
if (!request.raw.res.finished && | ||
event !== 'aborted') { | ||
request.raw.res.end(); | ||
} | ||
if (event || err) { | ||
@@ -276,18 +286,12 @@ request.emit('disconnect'); | ||
const tags = (err ? ['response', 'error'] : (event ? ['response', 'error', event] : ['response'])); | ||
request._log(tags, err); | ||
return callback(); | ||
}; | ||
}); | ||
source.once('error', end); | ||
const onAborted = () => { | ||
const onAborted = () => end(null, 'aborted'); | ||
const onClose = () => end(null, 'close'); | ||
return end(null, 'aborted'); | ||
}; | ||
const onClose = () => { | ||
return end(null, 'close'); | ||
}; | ||
request.raw.req.once('aborted', onAborted); | ||
@@ -305,12 +309,2 @@ request.raw.req.once('close', onClose); | ||
ranged.pipe(request.raw.res); | ||
// Injection | ||
if (isInjection) { | ||
request.raw.res._hapi = { request }; | ||
if (response.variety === 'plain') { | ||
request.raw.res._hapi.result = response._isPayloadSupported() ? response.source : null; | ||
} | ||
} | ||
}; | ||
@@ -340,3 +334,3 @@ | ||
return Boom.wrap(err); | ||
return Boom.boomify(err); | ||
} | ||
@@ -348,3 +342,3 @@ | ||
catch (err) { | ||
return Boom.wrap(err); | ||
return Boom.boomify(err); | ||
} | ||
@@ -383,4 +377,4 @@ | ||
const policy = request.route.settings.cache && | ||
request._route._cache && | ||
(request.route.settings.cache._statuses[response.statusCode] || (response.statusCode === 304 && request.route.settings.cache._statuses['200'])); | ||
request._route._cache && | ||
(request.route.settings.cache._statuses[response.statusCode] || (response.statusCode === 304 && request.route.settings.cache._statuses['200'])); | ||
@@ -441,4 +435,4 @@ if (policy || | ||
if ((!response._contentType || !postMarshal) && | ||
response.settings.charset && | ||
type.match(/^(?:text\/)|(?:application\/(?:json)|(?:javascript))/)) { | ||
response.settings.charset && | ||
type.match(/^(?:text\/)|(?:application\/(?:json)|(?:javascript))/)) { | ||
@@ -497,3 +491,3 @@ if (!type.match(/; *charset=/)) { | ||
if (err) { | ||
return next(Boom.wrap(err)); | ||
return next(Boom.boomify(err)); | ||
} | ||
@@ -508,3 +502,3 @@ | ||
if (err) { | ||
return next(Boom.wrap(err)); | ||
return next(Boom.boomify(err)); | ||
} | ||
@@ -511,0 +505,0 @@ |
@@ -21,6 +21,8 @@ 'use strict'; | ||
return (rule === false ? Joi.object({}).allow(null) | ||
: typeof rule === 'function' ? rule | ||
: !rule || rule === true ? null // false tested earlier | ||
: Joi.compile(rule)); | ||
return (rule === false) ? | ||
Joi.object({}).allow(null) : | ||
(typeof rule === 'function' ? | ||
rule : | ||
!rule || rule === true ? null : Joi.compile(rule)); // false tested earlier | ||
}; | ||
@@ -27,0 +29,0 @@ |
@@ -5,3 +5,3 @@ { | ||
"homepage": "http://hapijs.com", | ||
"version": "16.4.3", | ||
"version": "16.5.0", | ||
"repository": { | ||
@@ -38,3 +38,3 @@ "type": "git", | ||
"statehood": "5.x.x", | ||
"subtext": "4.x.x", | ||
"subtext": "5.x.x", | ||
"topo": "2.x.x" | ||
@@ -46,3 +46,3 @@ }, | ||
"inert": "4.x.x", | ||
"lab": "13.x.x", | ||
"lab": "14.x.x", | ||
"vision": "4.x.x", | ||
@@ -49,0 +49,0 @@ "wreck": "12.x.x" |
@@ -11,3 +11,3 @@ <img src="https://raw.github.com/hapijs/hapi/master/images/hapi.png" /> | ||
Development version: **16.4.x** ([release notes](https://github.com/hapijs/hapi/issues?labels=release+notes&page=1&state=closed)) | ||
Development version: **16.5.x** ([release notes](https://github.com/hapijs/hapi/issues?labels=release+notes&page=1&state=closed)) | ||
[](http://travis-ci.org/hapijs/hapi) | ||
@@ -26,5 +26,7 @@ | ||
- **Lob** | ||
- **Auth0** | ||
- **CNN Digital** | ||
- **Contentful** | ||
- The product development team at **Creative Artists Agency** | ||
@@ -31,0 +33,0 @@ #### Legacy Supporters |
184466
25
4491
35
+ Addedsubtext@5.1.3(transitive)
- Removedsubtext@4.4.1(transitive)
Updatedsubtext@5.x.x