@vtex/payment-provider-sdk
Version:
VTEX Payment Provider SDK
44 lines (43 loc) • 2.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSecureProxy = void 0;
const url_1 = require("url");
const util_1 = require("util");
const ramda_1 = require("ramda");
const utils_1 = require("./utils");
const nonProxyableHeaders = ['proxy-authorization', 'content-type', 'accept'];
const vtexHeaderPrefix = 'x-vtex-';
const forwardPrefix = 'x-provider-forward-';
const nonProxyable = ramda_1.pipe(ramda_1.toLower, ramda_1.either(ramda_1.startsWith(vtexHeaderPrefix), ramda_1.contains(ramda_1.__, nonProxyableHeaders)));
const forward = (_, headerName) => `${forwardPrefix}${headerName}`;
const useProtocol = (protocol) => (urlString) => {
const url = new url_1.URL(urlString);
url.protocol = protocol;
return url.toString();
};
const toHTTP = useProtocol('http');
const toHTTPS = useProtocol('https');
const useSecureProxy = (baseUrl) => async (middlewareContext, next) => {
const { config } = middlewareContext;
const secureProxyUrl = config.secureProxy;
if (util_1.isNullOrUndefined(secureProxyUrl)) {
await next();
return;
}
const destinationURL = `${baseUrl}${config.url}`;
// IO Works only in http and then use X-Vtex-Use-Https header to specify for that the destination should receive in https
config.headers.to = toHTTPS(destinationURL);
const nonFowardableHeaders = ramda_1.pickBy(nonProxyable, config.headers);
const forwardableHeaders = ramda_1.omit(ramda_1.keys(nonFowardableHeaders), config.headers);
const renamedHeaders = ramda_1.mapObjIndexed(forward, forwardableHeaders); // add x-provider-forward
const forwardedToProvider = utils_1.renameKeys(renamedHeaders, forwardableHeaders);
// Need switch to http then router will reroute to https
middlewareContext.config.url = toHTTP(secureProxyUrl);
middlewareContext.config.baseURL = undefined;
middlewareContext.config.headers = {
...nonFowardableHeaders,
...forwardedToProvider,
};
await next();
};
exports.useSecureProxy = useSecureProxy;