alayor
alayor

Reputation: 5035

Getting body content from request in node-mitm

I have the following node-mitm code.

 mitm = Mitm();
 mitm.on("request", function(req, res) {
   const body = req.body; //body is null
 })

I feel this has to do with reading node's IncomingMessage events, but I don't know how to do it.

Upvotes: 0

Views: 839

Answers (1)

Andri Möll
Andri Möll

Reputation: 426

Mitm.js's request handler is just like the one you're used to on Node's side. That is, it doesn't do anything special with req.body and leaves it as a ReadableStream.

You could either get its contents with the classical on("data") pattern:

mitm.on("request", function(req, res) {
   req.on("data", function(data) { data == "Hello" })
})

If you want to fake a larger service, I've sometimes used Express to create routes and then pass Express's route handler to Mitm:

var Router = require("express").Router
var router = Router().use(require("body-parser").text())

router.get("/", function(req, res) { req.end() })
mitm.on("request", route.bind(null, router))

function route(router, req, res) {
    router(req, res, function(err) {
        if (err == null) return
        res.writeHead(502)
        throw err
    })
}

The last example is a summary of the pattern I've also got publicly visible at the Rahvaalgatus open source repository: https://github.com/rahvaalgatus/rahvaalgatus.

Specifically, look at the controller test of https://github.com/rahvaalgatus/rahvaalgatus/blob/6dc91b026d75879cdc552bd2e63f220235b786c0/test/controllers/home_controller_test.js and see the this.router definition at https://github.com/rahvaalgatus/rahvaalgatus/blob/6dc91b026d75879cdc552bd2e63f220235b786c0/test/mitm.js.

Upvotes: 2

Related Questions