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-strategy
Usage 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
foo
constraint is matched - The
foo
constraint is not matched so the route without constraint is used - The
mustBeIn
constraint is matched - Like the 4), but this time the route without constraint is no used because of the flag
mustMatchWhenDerived: true
- The
appOption
constraint is matched - Multiple constraint matches
- Regardless the
appOption
constraint is matched, themustBeIn
constraint withmustMatchWhenDerived=true
forces the handler to be used - When there are multiple matches (the route with
foo
and route withmustBeIn
andappOption
), the route with more fulfilled constraint wins! - As the 8), the
mustBeIn
constraint 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.