⚡ Intercept the low-level http requests, which is helpful when you need to do logging, monitoring or instrumentation etc.
- transparent to the normal http flow without inference
- all errors in the interceptor are silently suppressed, only logged but not thrown
- never consume the original stream (
ClientRequest
orIncomingMessage
) when downstream consumer is not going to read or write
- capability of enabling or disabling the interception
RequestContext
is a request scope container to hold any data during the request-response round-trip, which is like the concept ofHttpServletRequest.getAttributes()
in Java.- generate a requestId and request timings by default in
RequestContext
npm i -g node-http-interceptor
ln -vs "$(npm root -g)" "$HOME"/.node_modules
node -r node-http-interceptor/register
import { HttpInterceptor, RequestContext } from './http-interceptor';
const interceptor = new HttpInterceptor();
interceptor.on('request.initiated', (request: ClientRequest, context: RequestContext) => {
// do somethong to mutate request
})
interceptor.on('request.sent', (request: Request, context: RequestContext) => {
// log the request
})
interceptor.on('response.received', (request: Request, response: Response, context: RequestContext) => {
// log the response
})
interceptor.on('response.error', (request: Request, error: any, context: RequestContext) => {
// log the error
})
interceptor.on('socket.error', (request: Request, error: any, context: RequestContext) => {
// log the error
})
interceptor.enable()
const interceptor = new HttpInterceptor();
interceptor.stub((req: Request) => ({
statusCode: 200,
statusMessage: 'OK',
headers: {
'content-type': 'text/plain',
'x-custom-header': 'blabla'
},
body: Buffer.from('test')
}));
interceptor.on('response.received', (response: Response, context: RequestContext) => {
expect(response.body.toString()).toEqual('test')
})
interceptor.enabled();
// later on
interceptor.unstub()