header-constraint-strategy
v3.0.0
Published
a find-my-way header constraint
Maintainers
Readme
header-constraint-strategy
A general purpose find-my-way custom constraint strategy.
Tested for Fastify ✅!
This module let you to drive the incoming HTTP request into a route based on the header's strict content. Doing so, if a request has a specific string header, it can reach a route hide behind a constraint. Go to the Usage section to get a complete overview of this feature!
Install
npm install header-constraint-strategyUsage with Fastify
Here all the constraint types you can define with this module!
This setup shows you all the settings header-constraint-strategy provides to you.
const headerConstraintStrategy = require('header-constraint-strategy')
const Fastify = require('fastify')
// STEP 1: setup the constraints into your fastify instance
const app = Fastify({
constraints: {
// basic usage
foo: headerConstraintStrategy('foo'),
// strict usage
mustBeIn: headerConstraintStrategy({ header: 'mustBeIn', mustMatchWhenDerived: true }),
// custom header usage
appOption: headerConstraintStrategy({ name: 'appOption', header: 'x-my-app' })
}
})
// STEP 2: use the constraint where you need them
app.get('/', {
handler: reply('no constraint')
})
app.get('/', {
handler: reply('foo'),
constraints: {
foo: 'bar'
}
})
app.get('/', {
handler: reply('mustBeIn'),
constraints: {
mustBeIn: '123'
}
})
app.get('/', {
handler: reply('appOption'),
constraints: {
appOption: 'ABC'
}
})
app.get('/', {
handler: reply('mustBeIn and appOption'),
constraints: {
mustBeIn: '123',
appOption: 'ABC'
}
})
app.listen(80)The routes can be reached via an HTTP request with these headers.
| # | foo header | mustBeIn header | x-my-app header | response |
|---|--------------|-------------------|-------------------|----------|
|1| - | - | - | 200 - no constraint
|2| bar | - | - | 200 - foo
|3| hello | - | - | 200 - no constraint
|4| - | 123 | - | 200 - mustBeIn
|5| - | 456 | - | 404
|6| - | - | ABC | 200 - appOption
|7| - | 123 | ABC | 200 - mustBeIn and appOption
|8| - | ops | ABC | 404
|9| bar | 123 | ABC | 200 - mustBeIn and appOption
|10| bar | ops | ABC | 404
Cases explanation
- When the is not headers that meets the constraint, the route without constraint will be used if set. Otherwise 404
- The
fooconstraint is matched - The
fooconstraint is not matched so the route without constraint is used - The
mustBeInconstraint is matched - Like the 4), but this time the route without constraint is no used because of the flag
mustMatchWhenDerived: true - The
appOptionconstraint is matched - Multiple constraint matches
- Regardless the
appOptionconstraint is matched, themustBeInconstraint withmustMatchWhenDerived=trueforces the handler to be used - When there are multiple matches (the route with
fooand route withmustBeInandappOption), the route with more fulfilled constraint wins! - As the 8), the
mustBeInconstraint is not fulfilled
Options
You can pass the following options during the registration:
| Option | Default | Description |
|--------|---------|-------------|
|name| as the header if not set | The name of the JSON property that you will set in the route's constraints option
|header| as the name if not set | The HTTP header where read the input to match the constraint
|mustMatchWhenDerived| false | Define if the same route without constraint must be evaluated for the routing. You can translate it as: is this constraint mandatory?
License
Copyright Manuel Spigolon, Licensed under MIT.
