UNPKG

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
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 }