moll / node-mitm

Intercept and mock outgoing Node.js network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Super useful when testing code that hits remote servers.
Other
636 stars 48 forks source link

Make connect opts available to request listeners #14

Open papandreou opened 9 years ago

papandreou commented 9 years ago

I'm implementing a "recording" mode in my testing lib where it would be really useful to know the originally intended host/port/etc. of the intercepted connection, which were passed as the second parameter to the connect listeners. Right now I can either try to get the host and port number from the Host header, which might not be the correct value, or I can have listeners for both the connect and request events and try to pair them up, which also seems like a fool's errand as they aren't necessarily one-to-one when keep-alive is in play.

Would it be possible to pass the connect opts as the third parameter to the request listeners?

Properly mocking out {req,res}.socket.{remote,local}{Family,Address,Port} would also be really nice, but even if they were, it would be nice to have the original, non-resolved host available.

vvo commented 9 years ago

:+1:

jakzo commented 5 years ago

Just documenting here my hacks to get around this until a proper solution is implemented:

mitm.on('connect', (socket, opts) => {
  let serverSocket = undefined;
  Object.defineProperty(socket, 'serverSocket', {
    set(server) {
      serverSocket = server;
      server._mitm = { client: socket, opts };
    },
    get() {
      return serverSocket;
    },
  });
});

mitm.on('request', (req, res) => {
  const { client, opts } = req.connection._mitm;
});

OR

mitm.on('connect', (socket, opts) => {
  socket._handle.remote._mitm = { client: socket, opts };
});

mitm.on('request', (req, res) => {
  const { client, opts } = req.connection._handle._mitm;
});