Skip to content

A low-level NodeJS http.request or https.request interceptor useful for debugging, logging, monitoring, instrumentations etc

License

Notifications You must be signed in to change notification settings

chaoyangnz/node-http-interceptor

Repository files navigation

Sponsor NPM version TypeScript version Node.js version Build Status - GitHub Actions

node-http-interceptor

⚡ Intercept the low-level http requests, which is helpful when you need to do logging, monitoring or instrumentation etc.

Features

  • 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 or IncomingMessage) 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 of HttpServletRequest.getAttributes() in Java.
  • generate a requestId and request timings by default in RequestContext

Timings

timings

Usage

nodejs preload modules

npm i -g node-http-interceptor
ln -vs "$(npm root -g)" "$HOME"/.node_modules
node -r node-http-interceptor/register

hooks

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()

stubbing

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()

About

A low-level NodeJS http.request or https.request interceptor useful for debugging, logging, monitoring, instrumentations etc

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published