@talentsoft-opensource/widget-display-tool
Version:
Widget Simulator
85 lines (79 loc) • 3.16 kB
text/typescript
const bodyParser = require("body-parser");
const urlParse = require("url").parse;
import { Application, Request as ERequest } from "express";
import { Logger } from "../logging";
import { RequestOptions } from "@talentsoft-opensource/integration-widget-contract";
import { requestExternalResource } from "./requestExternalResource";
import { downloadExternalResource } from "./downloadExternalResource";
import { SecurityMode } from "../securityModes/securityMode";
export function setupProxy(app: Application, logger: Logger) {
function logRequest(req: ERequest) {
logger.info(`incoming request - ${req.method} - ${req.url}`);
}
app.use(bodyParser.text({ type: '*/*'}));
app.all("/proxy", async function(req, res, next) {
logRequest(req);
const query = urlParse(req.url, true).query;
const { url, secretkey, login } = query;
const securitymode: SecurityMode =
query.securitymode || "directconnect";
if (!url || !secretkey || !login) {
res.sendStatus(400).json({
error:
"Missing querystring parameter. You must provide url, secretKey, login and securityMode"
});
return;
}
try {
const options: RequestOptions = {
url,
verb: req.method as any, // no solution for the moment :-(
body: req.body,
headers: req.headers as Record<string, string>
};
const result = await requestExternalResource(
options,
secretkey,
login,
securitymode
);
await res.json(result);
} catch (err) {
logger.error(err);
next(err);
}
});
app.all("/download", async function(req, res, next) {
const query = urlParse(req.url, true).query;
const { url, secretkey, login } = query;
const securitymode: SecurityMode =
query.securitymode || "directconnect";
if (!url || !secretkey || !login) {
res.sendStatus(400).json({
error:
"Missing querystring parameter. You must provide url, secretKey, login and securityMode"
});
return;
}
try {
const options: RequestOptions = {
url,
verb: req.method as any, // no solution for the moment :-(
body: req.body,
headers: req.headers as Record<string, string>
};
const result = await downloadExternalResource(
options,
secretkey,
login,
securitymode
);
res.set('Content-Type', result.headers["content-type"]);
res.set('Content-Disposition', result.headers["content-disposition"]);
return res.send(Buffer.from(result.body));
} catch (err) {
logger.error(err);
next(err);
}
});
}