header-constraint-strategy
v2.0.0
Published
a find-my-way header constraint
Downloads
282
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-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.