Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Log request/responses bodies with http-proxy-middleware

I'm using http-proxy-middleware to implement a transparent proxy.

I'd like to do request/response inspection. I mean, I'd like to print in a text file request/responses that go through the proxy whithout do any modifying on them.

Up to now, what I'm using is something like that (simplified version):

app.use('/proxy/:service/', proxy({
        pathRewrite: function(path, req){
            ...
        },
        router: function(req) {
            ...
        },
        onProxyRes: function(proxyRes, req, res) {
            log("Req URL: " + req.originalUrl);
            log("Response status code: " + proxyRes.statusCode);
        }
}));

(log() is a helper function that uses a string as input and prints it is my log file)

Thus, basically I'm using onProxyRes to intercept the response and do logging at that point. The problem is that I have been only able to make it work for things like URL, status code, headers, etc. but I haven't find the payload body in req and/or resProxy objects.

I have read about how to get the res body here. However, it seems to be complex solution (needs to set a data event handler). And it doesn't cover the req body, as far as I understand.

Any hint/help/reference is hightly appreciated, please. Not sure if even using onProxyRes is the best way of implementing this, maybe the library provides some functionality to cover the request/response case.

like image 931
fgalan Avatar asked May 11 '18 14:05

fgalan


People also ask

What is the use of HTTP proxy middleware?

The http-proxy-middleware module does not return a promise, instead it returns an express middleware. You can use a custom filter to decide whether or not to proxy the request. You need to add the pathRewrite options in order to rewrite the url according to the current hostname.

What is Express HTTP proxy?

Express middleware to proxy request to another host and pass response back to original caller.


1 Answers

If you use latest express version, this will work.

app.use(express.json())
app.use('/proxy/:service/', proxy({
        onProxyRes: function(proxyRes, req, res) {
            log("Req URL: " + req.originalUrl);
            log("Response status code: " + proxyRes.statusCode);
        }
}));
like image 109
Godwin Stanislaus Avatar answered Nov 12 '22 09:11

Godwin Stanislaus