Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
function checkContent(content, contextServers, openapi, options) {
contextAppend(options, 'content');
content.should.be.an.Object();
content.should.not.be.an.Array();
for (let ct in content) {
contextAppend(options, jptr.jpescape(ct));
// validate ct against https://tools.ietf.org/html/rfc6838#section-4.2
should(/[a-zA-Z0-9!#$%^&\*_\-\+{}\|'.`~]+\/[a-zA-Z0-9!#$%^&\*_\-\+{}\|'.`~]+/.test(ct)).be.exactly(true,'media-type should match RFC6838 format'); // this is a SHOULD not MUST
let contentType = content[ct];
should(contentType).be.an.Object();
should(contentType).not.be.an.Array();
if (typeof contentType.schema !== 'undefined') {
checkSchema(contentType.schema,emptySchema,'schema',openapi,options);
}
if (contentType.example) {
contentType.should.not.have.property('examples');
}
if (contentType.examples) {
contextAppend(options, 'examples');
contentType.should.not.have.property('example');
contentType.examples.should.be.an.Object();
function checkContent(content, contextServers, openapi, options) {
contextAppend(options, 'content');
should(content).be.an.Object();
should(content).not.be.an.Array();
for (let ct in content) {
contextAppend(options, jptr.jpescape(ct));
// validate ct against https://tools.ietf.org/html/rfc6838#section-4.2
if (options.mediatype) {
should(/[a-zA-Z0-9!#$%^&\*_\-\+{}\|'.`~]+\/[a-zA-Z0-9!#$%^&\*_\-\+{}\|'.`~]+/.test(ct)).be.exactly(true,'media-type should match RFC6838 format'); // this is a SHOULD not MUST
}
let contentType = content[ct];
should(contentType).be.an.Object();
should(contentType).not.be.an.Array();
if (typeof contentType.schema !== 'undefined') {
checkSchema(contentType.schema,emptySchema,'schema',openapi,options);
}
if (typeof contentType.example !== 'undefined') {
should(contentType).not.have.property('examples');
}
if (typeof contentType.examples !== 'undefined') {
contextAppend(options, 'examples');
if (op.parameters && op.parameters.length === 0) delete op.parameters;
if (op.requestBody) {
let effectiveOperationId = op.operationId ? common.sanitiseAll(op.operationId) : common.sanitiseAll(method + p).toCamelCase();
let rbName = common.sanitise(op.requestBody['x-s2o-name'] || effectiveOperationId || '');
delete op.requestBody['x-s2o-name'];
let rbStr = JSON.stringify(op.requestBody);
let rbHash = common.hash(rbStr);
if (!requestBodyCache[rbHash]) {
let entry = {};
entry.name = rbName;
entry.body = op.requestBody;
entry.refs = [];
requestBodyCache[rbHash] = entry;
}
let ptr = '#/'+containerName+'/'+encodeURIComponent(jptr.jpescape(p))+'/'+method+'/requestBody';
requestBodyCache[rbHash].refs.push(ptr);
}
}
}
if (path.parameters) {
for (let p2 in path.parameters) {
let param = path.parameters[p2];
processParameter(param, null, path, p, openapi, options); // index here is the path string
}
if (!options.debug) {
path.parameters = path.parameters.filter(deleteParameters);
}
}
}
}
if (op.parameters && op.parameters.length === 0) delete op.parameters;
if (op.requestBody) {
let effectiveOperationId = op.operationId ? common.sanitiseAll(op.operationId) : common.sanitiseAll(method + p).toCamelCase();
let rbName = common.sanitise(op.requestBody['x-s2o-name'] || effectiveOperationId || '');
delete op.requestBody['x-s2o-name'];
let rbStr = JSON.stringify(op.requestBody);
let rbHash = common.hash(rbStr);
if (!requestBodyCache[rbHash]) {
let entry = {};
entry.name = rbName;
entry.body = op.requestBody;
entry.refs = [];
requestBodyCache[rbHash] = entry;
}
let ptr = '#/'+containerName+'/'+encodeURIComponent(jptr.jpescape(p))+'/'+method+'/requestBody';
requestBodyCache[rbHash].refs.push(ptr);
}
}
}
}
if (path && path.parameters) {
for (let p2 in path.parameters) {
let param = path.parameters[p2];
processParameter(param, null, path, null, p, openapi, options); // index here is the path string
}
if (!options.debug && Array.isArray(path.parameters)) {
path.parameters = path.parameters.filter(keepParameters);
}
}
}
if (common.isRef(obj,key)) {
options.context.push(state.path);
obj[key].should.not.startWith('#/definitions/');
let refUrl = url.parse(obj[key]);
if (!refUrl.protocol && !refUrl.path) {
should(obj[key]+'/%24ref').not.be.equal(state.path,'Circular reference');
should(jptr.jptr(openapi,obj[key])).not.be.exactly(false, 'Cannot resolve reference: ' + obj[key]);
}
options.context.pop();
}
});
let paths = {};
for (let p in openapi.paths) {
options.context.push('#/paths/' + jptr.jpescape(p));
if (!p.startsWith('x-')) {
p.should.startWith('/');
let pCount = 0;
let template = p.replace(/\{(.+?)\}/g, function (match, group1) {
return '{'+(pCount++)+'}';
});
if (paths[template] && !openapi["x-hasEquivalentPaths"]) {
should.fail(false,true,'Identical path templates detected');
}
paths[template] = {};
let templateCheck = p.replace(/\{(.+?)\}/g, function (match, group1) {
return '';
});
if ((templateCheck.indexOf('{')>=0) || (templateCheck.indexOf('}')>=0)) {
should.fail(false,true,'Mismatched {} in path template');
}