diff --git a/server.js b/server.js index 5ddaafa..1474ad7 100644 --- a/server.js +++ b/server.js @@ -5769,6 +5769,57 @@ cache(function(data, match, sendBadge, request) { }); })); +// Swagger Validator integration. +camp.route(/^\/swagger\/(valid)\/(2\.0)\/(https?)\/(.+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var type = match[1]; // e.g. `valid` for validate + var specVer = match[2]; // e.g. `2.0` for OpenAPI 2.0 + var scheme = match[3]; // e.g. `https` + var swaggerUrl = match[4]; // e.g. `api.example.com/swagger.yaml` + var format = match[5]; + + var badgeData = getBadgeData('swagger', data); + + var urlParam = encodeURIComponent(scheme + '://' + swaggerUrl); + var url = 'http://online.swagger.io/validator/debug?url=' + urlParam; + var options = { + method: 'GET', + url: url, + gzip: true, + json: true + }; + request(options, function(err, res, json) { + try { + if (err != null || res.statusCode >= 500 || typeof json !== 'object') { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + + var messages = json.schemaValidationMessages; + if (messages == null || messages.length === 0) { + badgeData.colorscheme = 'brightgreen'; + badgeData.text[1] = 'valid'; + } else { + badgeData.colorscheme = 'red'; + + var firstMessage = messages[0]; + if (messages.length === 1 && + firstMessage.level === 'error' && + /^Can't read from/.test(firstMessage.message)) { + badgeData.text[1] = 'not found'; + } else { + badgeData.text[1] = 'invalid'; + } + } + sendBadge(format, badgeData); + } catch (e) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + } + }); +})); + // Any badge. camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/, function(data, match, end, ask) { diff --git a/try.html b/try.html index b6ce6d3..b1799ee 100644 --- a/try.html +++ b/try.html @@ -902,6 +902,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/amo/stars/dustman.svg + Swagger Validator: + + https://img.shields.io/swagger/valid/2.0/https/bitbucket.org/api/swagger.json.svg +

Longer Miscellaneous