npm: npm install @hapi/shot

yarn: yarn add @hapi/shot


Injects a fake HTTP request/response into a node HTTP server for simulating server logic, writing tests, or debugging. Does not use a socket connection so can be run against an inactive server (server not in listen mode).


const Http = require('http');
const Shot = require('@hapi/shot');

const internals = {};

internals.main = async function () {

    const dispatch = function (req, res) {

        const reply = 'Hello World';
        res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Length': reply.length });

    const server = Http.createServer(dispatch);

    const res = await Shot.inject(dispatch, { method: 'get', url: '/' });


Note how server.listen is never called.


await Shot.inject(dispatchFunc, options)

Injects a fake request into an HTTP server.

  • dispatchFunc - listener function. The same as you would pass to Http.createServer when making a node HTTP server. Has the signature function (req, res) where:
    • req - a simulated request object. Inherits from Stream.Readable.
    • res - a simulated response object. Inherits from node's Http.ServerResponse.
  • options - request options object where:
    • url - a string specifying the request URL.
    • method - a string specifying the HTTP request method, defaulting to 'GET'.
    • authority - a string specifying the HTTP HOST header value to be used if no header is provided, and the url does not include an authority component. Defaults to 'localhost'.
    • headers - an optional object containing request headers.
    • remoteAddress - an optional string specifying the client remote address. Defaults to ''.
    • payload - an optional request payload. Can be a string, Buffer, Stream or object.
    • simulate - an object containing flags to simulate various conditions:
      • end - indicates whether the request will fire an end event. Defaults to undefined, meaning an end event will fire.
      • split - indicates whether the request payload will be split into chunks. Defaults to undefined, meaning payload will not be chunked.
      • error - whether the request will emit an error event. Defaults to undefined, meaning no error event will be emitted. If set to true, the emitted error will have a message of 'Simulated'.
      • close - whether the request will emit a close event. Defaults to undefined, meaning no close event will be emitted.
    • validate - Optional flag to validate this options object. Defaults to true.

Returns a response object where:

  • raw - an object containing the raw request and response objects where:
    • req - the simulated request object.
    • res - the simulated response object.
  • headers - an object containing the response headers.
  • statusCode - the HTTP status code.
  • statusMessage - the HTTP status message.
  • payload - the payload as a UTF-8 encoded string.
  • rawPayload - the raw payload as a Buffer.
  • trailers - an object containing the response trailers.


Checks if given object obj is a Shot Request object.


Update joi
work around Node's DEP0066
Node V12 deprecation warning [DEP0066] OutgoingMessage.prototype._headers is deprecated
Change module name
Remove engines
Update deps
Updated lab to v17 to pass on Node v11
skip not covered lines on node master
Update joi
Replace instanceof with symbol
Update deps
Commercial version of v3 branch
Fix for node 8
Fix node 8 issues
breaking changes
Update deps
Handle streams of utf8 encoded strings
Remove custom output parsing and buffer payload chunks via write()
Updated API docs to reflect new validate flag
Cleanup validation and make it optional
Add status message to response object
add validation schema to shot
Include statusMessage
Update code to 3.x.x
Test on node 6, update lab and fix tests
Support stream payloads
Adds quotes around node versions in travis file
Add default port to host header when no port specified. Fixes #62
Reduce function generation
Refactor index.js into separate files
breaking changes
Update README with ES6 styles
Updated README for ES6 styles closes #59
Set trailers in res.trailers rather than res.headers. Fixes #56
Trailers should be added to res.trailers, not res.headers
Fix broken tests
breaking changes
Node >= 4 / es2015 updates
Upgrade lab to 7.x.x. Closes #50
Add authority option. Closes #46
Add authority option for overriding default host header
Always include a host header. Closes #43
host header is not always set
Inject request with specified the remote client IP address
Client IP address
Inconsistent assignment of rawPayload
use rawPayload, convert to UTF8 after the whole buffer is available
fix #7
deprecated encoding 'binary' is used
Add 'content-length' header matching payload length if none set
add -L to test and test-cov
Added Hoek.applyToDefaults.
Use Hoek to assign defaults to options passed to inject. Fixes #22
Use hoek to assign defaults to options passed to inject
optionally accept an object as the `url`
lab 4.0
Remove repeated assignment
Bring coverage back to 100%
Bring coverage back to 100% after lab fix
Support node 0.11