64 lines
2.4 KiB
JavaScript
64 lines
2.4 KiB
JavaScript
/**
|
|
* Extract request/response XML from RR response/result shapes.
|
|
* @param rrObj
|
|
* @returns {{requestXml: string|null, responseXml: string|null}}
|
|
*/
|
|
const extractRRXmlPair = (rrObj) => {
|
|
const xml = rrObj?.xml ?? rrObj?.meta?.xml;
|
|
|
|
let requestXml = null;
|
|
let responseXml = null;
|
|
|
|
if (typeof xml === "string") {
|
|
requestXml = xml;
|
|
} else {
|
|
if (typeof xml?.request === "string") requestXml = xml.request;
|
|
else if (typeof xml?.req === "string") requestXml = xml.req;
|
|
else if (typeof xml?.starXml === "string") requestXml = xml.starXml;
|
|
if (typeof xml?.response === "string") responseXml = xml.response;
|
|
}
|
|
|
|
if (!requestXml && typeof rrObj?.requestXml === "string") requestXml = rrObj.requestXml;
|
|
if (!requestXml && typeof rrObj?.meta?.requestXml === "string") requestXml = rrObj.meta.requestXml;
|
|
if (!requestXml && typeof rrObj?.meta?.reqXml === "string") requestXml = rrObj.meta.reqXml;
|
|
if (!requestXml && typeof rrObj?.meta?.request === "string") requestXml = rrObj.meta.request;
|
|
if (!responseXml && typeof rrObj?.responseXml === "string") responseXml = rrObj.responseXml;
|
|
if (!responseXml && typeof rrObj?.meta?.responseXml === "string") responseXml = rrObj.meta.responseXml;
|
|
if (!responseXml && typeof rrObj?.meta?.resXml === "string") responseXml = rrObj.meta.resXml;
|
|
if (!responseXml && typeof rrObj?.meta?.response === "string") responseXml = rrObj.meta.response;
|
|
|
|
// If wrapped HTTP response data contains raw XML, surface it.
|
|
if (!responseXml && typeof rrObj?.response?.data === "string") {
|
|
const xmlData = rrObj.response.data.trim();
|
|
if (xmlData.startsWith("<")) responseXml = xmlData;
|
|
}
|
|
|
|
// Try one level down when errors are wrapped.
|
|
if ((!requestXml || !responseXml) && rrObj?.cause && rrObj.cause !== rrObj) {
|
|
const nested = extractRRXmlPair(rrObj.cause);
|
|
if (!requestXml) requestXml = nested.requestXml;
|
|
if (!responseXml) responseXml = nested.responseXml;
|
|
}
|
|
|
|
return { requestXml, responseXml };
|
|
};
|
|
|
|
/**
|
|
* Add Reynolds request/response XML to RR log metadata when available.
|
|
* @param rrObj
|
|
* @param meta
|
|
* @returns {*}
|
|
*/
|
|
const withRRRequestXml = (rrObj, meta = {}) => {
|
|
const { requestXml, responseXml } = extractRRXmlPair(rrObj);
|
|
const xmlMeta = {};
|
|
if (requestXml) xmlMeta.requestXml = requestXml;
|
|
if (responseXml) xmlMeta.responseXml = responseXml;
|
|
return Object.keys(xmlMeta).length ? { ...meta, ...xmlMeta } : meta;
|
|
};
|
|
|
|
module.exports = {
|
|
extractRRXmlPair,
|
|
withRRRequestXml
|
|
};
|