reqover
Version:
Reqover is language agnostic tool that gives a picture about coverage of APIs based on Open API (Swagger).
95 lines (79 loc) • 2.33 kB
JavaScript
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const isUrl = require('is-url');
const { v4 } = require('uuid');
const fs = require("fs");
const path = require("path");
const HOST = "0.0.0.0";
function record(port, target) {
const app = express();
// Proxy endpoints
app.use('/', createProxyMiddleware({
target: target,
secure: false,
changeOrigin: true,
pathRewrite: {
['^/']: '',
},
onProxyReq: proxyReq,
onProxyRes: proxyRes,
}));
app.listen(port, HOST, () => {
console.log(`Starting Proxy at ${HOST}:${port}`);
});
}
const proxyReq = (proxyReq, req) => {
// add custom header to request
if (!req.body) {
return;
}
const contentType = proxyReq.getHeader('Content-Type');
const writeBody = (bodyData) => {
proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
proxyReq.write(bodyData);
};
if (contentType === 'application/json') {
writeBody(JSON.stringify(req.body));
}
if (contentType === 'application/x-www-form-urlencoded') {
writeBody(querystring.stringify(req.body));
}
// or log the req
};
const proxyRes = async (proxyRes, req, res) => {
const method = req.method;
const responseStatus = `${proxyRes.statusCode}`;
const apiPath = getPath(req);
const params = req.query;
const queryParameters = Object.entries(params).map(([p, v]) => {
return {name: p, value: v};
});
const body = req.body;
const result = {
uuid: v4(),
path: apiPath,
method: method,
statusCode: responseStatus,
parameters: queryParameters,
body: body,
};
const data = JSON.stringify(result);
saveResult(path.join(".", "reqover-results"), data);
console.log(`Result: ${data}`)
};
const getPath = (req) => {
const originalUrl = req.originalUrl.split('?')[0];
if (isUrl(originalUrl)) {
return urlParse(originalUrl).pathname;
}
return originalUrl;
};
const saveResult = (dir, result) => {
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(`${dir}/${v4()}.json`, result);
}
module.exports = {
record
}