@@ -2,7 +2,7 @@ | |||
<html> | |||
<head> | |||
<title>Swagger UI</title> | |||
<link href='//fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'/> | |||
<link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/> | |||
<link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/> | |||
<link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/> | |||
<link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/> | |||
@@ -1508,338 +1508,6 @@ SwaggerRequest.prototype.setHeaders = function (params, opts, operation) { | |||
return headers; | |||
} | |||
/** | |||
* SwaggerHttp is a wrapper for executing requests | |||
*/ | |||
var SwaggerHttp = function () { }; | |||
SwaggerHttp.prototype.execute = function (obj) { | |||
if (obj && (typeof obj.useJQuery === 'boolean')) | |||
this.useJQuery = obj.useJQuery; | |||
else | |||
this.useJQuery = this.isIE8(); | |||
if (this.useJQuery) | |||
return new JQueryHttpClient().execute(obj); | |||
else | |||
return new ShredHttpClient().execute(obj); | |||
} | |||
SwaggerHttp.prototype.isIE8 = function () { | |||
var detectedIE = false; | |||
if (typeof navigator !== 'undefined' && navigator.userAgent) { | |||
nav = navigator.userAgent.toLowerCase(); | |||
if (nav.indexOf('msie') !== -1) { | |||
var version = parseInt(nav.split('msie')[1]); | |||
if (version <= 8) { | |||
detectedIE = true; | |||
} | |||
} | |||
} | |||
return detectedIE; | |||
}; | |||
/* | |||
* JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic. | |||
* NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space. | |||
* Since we are using closures here we need to alias it for internal use. | |||
*/ | |||
var JQueryHttpClient = function (options) { | |||
this.options = options || {}; | |||
if (!jQuery) { | |||
var jQuery = window.jQuery; | |||
} | |||
} | |||
JQueryHttpClient.prototype.execute = function (obj) { | |||
var cb = obj.on; | |||
var request = obj; | |||
obj.type = obj.method; | |||
obj.cache = false; | |||
obj.beforeSend = function (xhr) { | |||
var key, results; | |||
if (obj.headers) { | |||
results = []; | |||
var key; | |||
for (key in obj.headers) { | |||
if (key.toLowerCase() === 'content-type') { | |||
results.push(obj.contentType = obj.headers[key]); | |||
} else if (key.toLowerCase() === 'accept') { | |||
results.push(obj.accepts = obj.headers[key]); | |||
} else { | |||
results.push(xhr.setRequestHeader(key, obj.headers[key])); | |||
} | |||
} | |||
return results; | |||
} | |||
}; | |||
obj.data = obj.body; | |||
obj.complete = function (response) { | |||
var headers = {}, | |||
headerArray = response.getAllResponseHeaders().split('\n'); | |||
for (var i = 0; i < headerArray.length; i++) { | |||
var toSplit = headerArray[i].trim(); | |||
if (toSplit.length === 0) | |||
continue; | |||
var separator = toSplit.indexOf(':'); | |||
if (separator === -1) { | |||
// Name but no value in the header | |||
headers[toSplit] = null; | |||
continue; | |||
} | |||
var name = toSplit.substring(0, separator).trim(), | |||
value = toSplit.substring(separator + 1).trim(); | |||
headers[name] = value; | |||
} | |||
var out = { | |||
url: request.url, | |||
method: request.method, | |||
status: response.status, | |||
data: response.responseText, | |||
headers: headers | |||
}; | |||
var contentType = (headers['content-type'] || headers['Content-Type'] || null) | |||
if (contentType != null) { | |||
if (contentType.indexOf('application/json') == 0 || contentType.indexOf('+json') > 0) { | |||
if (response.responseText && response.responseText !== '') | |||
out.obj = JSON.parse(response.responseText); | |||
else | |||
out.obj = {} | |||
} | |||
} | |||
if (response.status >= 200 && response.status < 300) | |||
cb.response(out); | |||
else if (response.status === 0 || (response.status >= 400 && response.status < 599)) | |||
cb.error(out); | |||
else | |||
return cb.response(out); | |||
}; | |||
jQuery.support.cors = true; | |||
return jQuery.ajax(obj); | |||
} | |||
/* | |||
* ShredHttpClient is a light-weight, node or browser HTTP client | |||
*/ | |||
var ShredHttpClient = function (options) { | |||
this.options = (options || {}); | |||
this.isInitialized = false; | |||
if (typeof window !== 'undefined') { | |||
this.Shred = require('./shred'); | |||
this.content = require('./shred/content'); | |||
} | |||
else | |||
this.Shred = require('shred'); | |||
this.shred = new this.Shred(); | |||
} | |||
ShredHttpClient.prototype.initShred = function () { | |||
this.isInitialized = true; | |||
this.registerProcessors(this.shred); | |||
} | |||
ShredHttpClient.prototype.registerProcessors = function () { | |||
var identity = function (x) { | |||
return x; | |||
}; | |||
var toString = function (x) { | |||
return x.toString(); | |||
}; | |||
if (typeof window !== 'undefined') { | |||
this.content.registerProcessor(['application/json; charset=utf-8', 'application/json', 'json'], { | |||
parser: identity, | |||
stringify: toString | |||
}); | |||
} else { | |||
this.Shred.registerProcessor(['application/json; charset=utf-8', 'application/json', 'json'], { | |||
parser: identity, | |||
stringify: toString | |||
}); | |||
} | |||
} | |||
ShredHttpClient.prototype.execute = function (obj) { | |||
if (!this.isInitialized) | |||
this.initShred(); | |||
var cb = obj.on, res; | |||
var transform = function (response) { | |||
var out = { | |||
headers: response._headers, | |||
url: response.request.url, | |||
method: response.request.method, | |||
status: response.status, | |||
data: response.content.data | |||
}; | |||
var headers = response._headers.normalized || response._headers; | |||
var contentType = (headers['content-type'] || headers['Content-Type'] || null) | |||
if (contentType != null) { | |||
if (contentType.indexOf('application/json') == 0 || contentType.indexOf('+json') > 0) { | |||
if (response.content.data && response.content.data !== '') | |||
try { | |||
out.obj = JSON.parse(response.content.data); | |||
} | |||
catch (ex) { | |||
// do not set out.obj | |||
log('unable to parse JSON content'); | |||
} | |||
else | |||
out.obj = {} | |||
} | |||
} | |||
return out; | |||
}; | |||
// Transform an error into a usable response-like object | |||
var transformError = function (error) { | |||
var out = { | |||
// Default to a status of 0 - The client will treat this as a generic permissions sort of error | |||
status: 0, | |||
data: error.message || error | |||
}; | |||
if (error.code) { | |||
out.obj = error; | |||
if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') { | |||
// We can tell the client that this should be treated as a missing resource and not as a permissions thing | |||
out.status = 404; | |||
} | |||
} | |||
return out; | |||
}; | |||
var res = { | |||
error: function (response) { | |||
if (obj) | |||
return cb.error(transform(response)); | |||
}, | |||
// Catch the Shred error raised when the request errors as it is made (i.e. No Response is coming) | |||
request_error: function (err) { | |||
if (obj) | |||
return cb.error(transformError(err)); | |||
}, | |||
response: function (response) { | |||
if (obj) | |||
return cb.response(transform(response)); | |||
} | |||
}; | |||
if (obj) { | |||
obj.on = res; | |||
} | |||
return this.shred.request(obj); | |||
}; | |||
/** | |||
* SwaggerAuthorizations applys the correct authorization to an operation being executed | |||
*/ | |||
var SwaggerAuthorizations = function (name, auth) { | |||
this.authz = {}; | |||
if(name && auth) { | |||
this.authz[name] = auth; | |||
} | |||
}; | |||
SwaggerAuthorizations.prototype.add = function (name, auth) { | |||
this.authz[name] = auth; | |||
return auth; | |||
}; | |||
SwaggerAuthorizations.prototype.remove = function (name) { | |||
return delete this.authz[name]; | |||
}; | |||
SwaggerAuthorizations.prototype.apply = function (obj, authorizations) { | |||
var status = null; | |||
var key, value, result; | |||
// if the "authorizations" key is undefined, or has an empty array, add all keys | |||
if (typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) { | |||
for (key in this.authz) { | |||
value = this.authz[key]; | |||
result = value.apply(obj, authorizations); | |||
if (result === true) | |||
status = true; | |||
} | |||
} | |||
else { | |||
for (name in authorizations) { | |||
for (key in this.authz) { | |||
if (key == name) { | |||
value = this.authz[key]; | |||
result = value.apply(obj, authorizations); | |||
if (result === true) | |||
status = true; | |||
} | |||
} | |||
} | |||
} | |||
return status; | |||
}; | |||
/** | |||
* ApiKeyAuthorization allows a query param or header to be injected | |||
*/ | |||
var ApiKeyAuthorization = function (name, value, type, delimiter) { | |||
this.name = name; | |||
this.value = value; | |||
this.type = type; | |||
this.delimiter = delimiter; | |||
}; | |||
ApiKeyAuthorization.prototype.apply = function (obj) { | |||
if (this.type === 'query') { | |||
if (obj.url.indexOf('?') > 0) | |||
obj.url = obj.url + '&' + this.name + '=' + this.value; | |||
else | |||
obj.url = obj.url + '?' + this.name + '=' + this.value; | |||
return true; | |||
} else if (this.type === 'header') { | |||
if (typeof obj.headers[this.name] !== 'undefined') { | |||
if (typeof this.delimiter !== 'undefined') | |||
obj.headers[this.name] = obj.headers[this.name] + this.delimiter + this.value; | |||
} | |||
else | |||
obj.headers[this.name] = this.value; | |||
return true; | |||
} | |||
}; | |||
/** | |||
* Password Authorization is a basic auth implementation | |||
*/ | |||
var PasswordAuthorization = function (name, username, password) { | |||
this.name = name; | |||
this.username = username; | |||
this.password = password; | |||
this._btoa = null; | |||
if (typeof window !== 'undefined') | |||
this._btoa = btoa; | |||
else | |||
this._btoa = require('btoa'); | |||
}; | |||
PasswordAuthorization.prototype.apply = function (obj) { | |||
var base64encoder = this._btoa; | |||
obj.headers['Authorization'] = 'Basic ' + base64encoder(this.username + ':' + this.password); | |||
return true; | |||
}; | |||
var SwaggerClient = function(url, options) { | |||
this.isBuilt = false; | |||
this.url = null; | |||
@@ -2002,6 +1670,7 @@ SwaggerClient.prototype.buildFromSpec = function(response) { | |||
if(typeof operationGroup === 'undefined') { | |||
this[tag] = []; | |||
operationGroup = this[tag]; | |||
operationGroup.operations = {}; | |||
operationGroup.label = tag; | |||
operationGroup.apis = []; | |||
this[tag].help = this.help.bind(operationGroup); | |||
@@ -2010,6 +1679,7 @@ SwaggerClient.prototype.buildFromSpec = function(response) { | |||
operationGroup[operationId] = operationObject.execute.bind(operationObject); | |||
operationGroup[operationId].help = operationObject.help.bind(operationObject); | |||
operationGroup.apis.push(operationObject); | |||
operationGroup.operations[operationId] = operationObject; | |||
// legacy UI feature | |||
var j; | |||
@@ -2061,16 +1731,8 @@ SwaggerClient.prototype.tagFromLabel = function(label) { | |||
}; | |||
SwaggerClient.prototype.idFromOp = function(path, httpMethod, op) { | |||
if(typeof op.operationId !== 'undefined') { | |||
return (op.operationId); | |||
} | |||
else { | |||
return path.substring(1) | |||
.replace(/\//g, "_") | |||
.replace(/\{/g, "") | |||
.replace(/\}/g, "") | |||
.replace(/\./g, "_") + "_" + httpMethod; | |||
} | |||
var opId = op.operationId || (path.substring(1) + '_' + httpMethod); | |||
return opId.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()\+\s]/g,'_'); | |||
}; | |||
SwaggerClient.prototype.fail = function(message) { | |||
@@ -2093,6 +1755,7 @@ var Operation = function(parent, operationId, httpMethod, path, args, definition | |||
parent = parent||{}; | |||
args = args||{}; | |||
this.operations = {}; | |||
this.operation = args; | |||
this.deprecated = args.deprecated; | |||
this.consumes = args.consumes; | |||
@@ -2112,6 +1775,7 @@ var Operation = function(parent, operationId, httpMethod, path, args, definition | |||
this.security = args.security; | |||
this.authorizations = args.security; | |||
this.description = args.description; | |||
this.useJQuery = parent.useJQuery; | |||
var i; | |||
for(i = 0; i < this.parameters.length; i++) { | |||
@@ -2240,12 +1904,12 @@ Operation.prototype.getType = function (param) { | |||
if(param.items) | |||
str = this.getType(param.items); | |||
} | |||
if(param['$ref']) | |||
str = param['$ref']; | |||
if(param.$ref) | |||
str = param.$ref; | |||
var schema = param.schema; | |||
if(schema) { | |||
var ref = schema['$ref']; | |||
var ref = schema.$ref; | |||
if(ref) { | |||
ref = simpleRef(ref); | |||
if(isArray) | |||
@@ -2263,12 +1927,13 @@ Operation.prototype.getType = function (param) { | |||
}; | |||
Operation.prototype.resolveModel = function (schema, definitions) { | |||
if(typeof schema['$ref'] !== 'undefined') { | |||
var ref = schema['$ref']; | |||
if(typeof schema.$ref !== 'undefined') { | |||
var ref = schema.$ref; | |||
if(ref.indexOf('#/definitions/') == 0) | |||
ref = ref.substring('#/definitions/'.length); | |||
if(definitions[ref]) | |||
if(definitions[ref]) { | |||
return new Model(ref, definitions[ref]); | |||
} | |||
} | |||
if(schema.type === 'array') | |||
return new ArrayModel(schema); | |||
@@ -2402,8 +2067,11 @@ Operation.prototype.getBody = function(headers, args) { | |||
for(var i = 0; i < this.parameters.length; i++) { | |||
var param = this.parameters[i]; | |||
if(typeof args[param.name] !== 'undefined') { | |||
if (param.in === 'body') | |||
if (param.in === 'body') { | |||
body = args[param.name]; | |||
} else if(param.in === 'formData') { | |||
formParams[param.name] = args[param.name]; | |||
} | |||
} | |||
} | |||
@@ -2484,6 +2152,10 @@ Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) { | |||
success = (success||log); | |||
error = (error||log); | |||
if(typeof opts.useJQuery === 'boolean') { | |||
this.useJQuery = opts.useJQuery; | |||
} | |||
var missingParams = this.getMissingParams(args); | |||
if(missingParams.length > 0) { | |||
var message = 'missing required params: ' + missingParams; | |||
@@ -2497,7 +2169,7 @@ Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) { | |||
var obj = { | |||
url: url, | |||
method: this.method, | |||
method: this.method.toUpperCase(), | |||
body: body, | |||
useJQuery: this.useJQuery, | |||
headers: headers, | |||
@@ -2511,7 +2183,10 @@ Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) { | |||
} | |||
}; | |||
var status = e.authorizations.apply(obj, this.operation.security); | |||
new SwaggerHttp().execute(obj); | |||
if(opts.mock === true) | |||
return obj; | |||
else | |||
new SwaggerHttp().execute(obj); | |||
}; | |||
Operation.prototype.setContentTypes = function(args, opts) { | |||
@@ -2688,7 +2363,10 @@ var Model = function(name, definition) { | |||
this.definition = definition || {}; | |||
this.properties = []; | |||
var requiredFields = definition.required || []; | |||
if(definition.type === 'array') { | |||
var out = new ArrayModel(definition); | |||
return out; | |||
} | |||
var key; | |||
var props = definition.properties; | |||
if(props) { | |||
@@ -2698,7 +2376,7 @@ var Model = function(name, definition) { | |||
if(requiredFields.indexOf(key) >= 0) | |||
required = true; | |||
this.properties.push(new Property(key, property, required)); | |||
} | |||
} | |||
} | |||
}; | |||
@@ -2746,7 +2424,7 @@ Model.prototype.getMockSignature = function(modelsToIgnore) { | |||
var i; | |||
for (i = 0; i < this.properties.length; i++) { | |||
var prop = this.properties[i]; | |||
var ref = prop['$ref']; | |||
var ref = prop.$ref; | |||
var model = models[ref]; | |||
if (model && typeof modelsToIgnore[model.name] === 'undefined') { | |||
returnVal = returnVal + ('<br>' + model.getMockSignature(modelsToIgnore)); | |||
@@ -2758,11 +2436,11 @@ Model.prototype.getMockSignature = function(modelsToIgnore) { | |||
var Property = function(name, obj, required) { | |||
this.schema = obj; | |||
this.required = required; | |||
if(obj['$ref']) | |||
this['$ref'] = simpleRef(obj['$ref']); | |||
if(obj.$ref) | |||
this.$ref = simpleRef(obj.$ref); | |||
else if (obj.type === 'array') { | |||
if(obj.items['$ref']) | |||
this['$ref'] = simpleRef(obj.items['$ref']); | |||
if(obj.items.$ref) | |||
this.$ref = simpleRef(obj.items.$ref); | |||
else | |||
obj = obj.items; | |||
} | |||
@@ -2792,8 +2470,8 @@ Property.prototype.sampleValue = function(isArray, ignoredModels) { | |||
var type = getStringSignature(this.obj); | |||
var output; | |||
if(this['$ref']) { | |||
var refModelName = simpleRef(this['$ref']); | |||
if(this.$ref) { | |||
var refModelName = simpleRef(this.$ref); | |||
var refModel = models[refModelName]; | |||
if(refModel && typeof ignoredModels[type] === 'undefined') { | |||
ignoredModels[type] = this; | |||
@@ -2832,7 +2510,7 @@ Property.prototype.sampleValue = function(isArray, ignoredModels) { | |||
getStringSignature = function(obj) { | |||
var str = ''; | |||
if(obj.type === 'array') { | |||
obj = (obj.items || obj['$ref'] || {}); | |||
obj = (obj.items || obj.$ref || {}); | |||
str += 'Array['; | |||
} | |||
if(obj.type === 'integer' && obj.format === 'int32') | |||
@@ -2853,8 +2531,8 @@ getStringSignature = function(obj) { | |||
str += 'double'; | |||
else if(obj.type === 'boolean') | |||
str += 'boolean'; | |||
else if(obj['$ref']) | |||
str += simpleRef(obj['$ref']); | |||
else if(obj.$ref) | |||
str += simpleRef(obj.$ref); | |||
else | |||
str += obj.type; | |||
if(obj.type === 'array') | |||
@@ -2879,7 +2557,7 @@ Property.prototype.toString = function() { | |||
str += ', <span class="propOptKey">optional</span>'; | |||
str += ')'; | |||
} | |||
else | |||
else | |||
str = this.name + ' (' + JSON.stringify(this.obj) + ')'; | |||
if(typeof this.description !== 'undefined') | |||
@@ -3019,17 +2697,12 @@ JQueryHttpClient.prototype.execute = function(obj) { | |||
var contentType = (headers["content-type"]||headers["Content-Type"]||null); | |||
if(contentType != null) { | |||
if(contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) { | |||
if(response.responseText && response.responseText !== "") { | |||
try { | |||
out.obj = JSON.parse(response.content.data); | |||
} | |||
catch (ex) { | |||
// do not set out.obj | |||
log ("unable to parse JSON content"); | |||
} | |||
try { | |||
out.obj = response.responseJSON || {}; | |||
} catch (ex) { | |||
// do not set out.obj | |||
log("unable to parse JSON content"); | |||
} | |||
else | |||
out.obj = {}; | |||
} | |||
} | |||
@@ -3163,6 +2836,7 @@ ShredHttpClient.prototype.execute = function(obj) { | |||
return this.shred.request(obj); | |||
}; | |||
var e = (typeof window !== 'undefined' ? window : exports); | |||
e.authorizations = new SwaggerAuthorizations(); | |||
@@ -1508,338 +1508,6 @@ SwaggerRequest.prototype.setHeaders = function (params, opts, operation) { | |||
return headers; | |||
} | |||
/** | |||
* SwaggerHttp is a wrapper for executing requests | |||
*/ | |||
var SwaggerHttp = function () { }; | |||
SwaggerHttp.prototype.execute = function (obj) { | |||
if (obj && (typeof obj.useJQuery === 'boolean')) | |||
this.useJQuery = obj.useJQuery; | |||
else | |||
this.useJQuery = this.isIE8(); | |||
if (this.useJQuery) | |||
return new JQueryHttpClient().execute(obj); | |||
else | |||
return new ShredHttpClient().execute(obj); | |||
} | |||
SwaggerHttp.prototype.isIE8 = function () { | |||
var detectedIE = false; | |||
if (typeof navigator !== 'undefined' && navigator.userAgent) { | |||
nav = navigator.userAgent.toLowerCase(); | |||
if (nav.indexOf('msie') !== -1) { | |||
var version = parseInt(nav.split('msie')[1]); | |||
if (version <= 8) { | |||
detectedIE = true; | |||
} | |||
} | |||
} | |||
return detectedIE; | |||
}; | |||
/* | |||
* JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic. | |||
* NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space. | |||
* Since we are using closures here we need to alias it for internal use. | |||
*/ | |||
var JQueryHttpClient = function (options) { | |||
this.options = options || {}; | |||
if (!jQuery) { | |||
var jQuery = window.jQuery; | |||
} | |||
} | |||
JQueryHttpClient.prototype.execute = function (obj) { | |||
var cb = obj.on; | |||
var request = obj; | |||
obj.type = obj.method; | |||
obj.cache = false; | |||
obj.beforeSend = function (xhr) { | |||
var key, results; | |||
if (obj.headers) { | |||
results = []; | |||
var key; | |||
for (key in obj.headers) { | |||
if (key.toLowerCase() === 'content-type') { | |||
results.push(obj.contentType = obj.headers[key]); | |||
} else if (key.toLowerCase() === 'accept') { | |||
results.push(obj.accepts = obj.headers[key]); | |||
} else { | |||
results.push(xhr.setRequestHeader(key, obj.headers[key])); | |||
} | |||
} | |||
return results; | |||
} | |||
}; | |||
obj.data = obj.body; | |||
obj.complete = function (response) { | |||
var headers = {}, | |||
headerArray = response.getAllResponseHeaders().split('\n'); | |||
for (var i = 0; i < headerArray.length; i++) { | |||
var toSplit = headerArray[i].trim(); | |||
if (toSplit.length === 0) | |||
continue; | |||
var separator = toSplit.indexOf(':'); | |||
if (separator === -1) { | |||
// Name but no value in the header | |||
headers[toSplit] = null; | |||
continue; | |||
} | |||
var name = toSplit.substring(0, separator).trim(), | |||
value = toSplit.substring(separator + 1).trim(); | |||
headers[name] = value; | |||
} | |||
var out = { | |||
url: request.url, | |||
method: request.method, | |||
status: response.status, | |||
data: response.responseText, | |||
headers: headers | |||
}; | |||
var contentType = (headers['content-type'] || headers['Content-Type'] || null) | |||
if (contentType != null) { | |||
if (contentType.indexOf('application/json') == 0 || contentType.indexOf('+json') > 0) { | |||
if (response.responseText && response.responseText !== '') | |||
out.obj = JSON.parse(response.responseText); | |||
else | |||
out.obj = {} | |||
} | |||
} | |||
if (response.status >= 200 && response.status < 300) | |||
cb.response(out); | |||
else if (response.status === 0 || (response.status >= 400 && response.status < 599)) | |||
cb.error(out); | |||
else | |||
return cb.response(out); | |||
}; | |||
jQuery.support.cors = true; | |||
return jQuery.ajax(obj); | |||
} | |||
/* | |||
* ShredHttpClient is a light-weight, node or browser HTTP client | |||
*/ | |||
var ShredHttpClient = function (options) { | |||
this.options = (options || {}); | |||
this.isInitialized = false; | |||
if (typeof window !== 'undefined') { | |||
this.Shred = require('./shred'); | |||
this.content = require('./shred/content'); | |||
} | |||
else | |||
this.Shred = require('shred'); | |||
this.shred = new this.Shred(); | |||
} | |||
ShredHttpClient.prototype.initShred = function () { | |||
this.isInitialized = true; | |||
this.registerProcessors(this.shred); | |||
} | |||
ShredHttpClient.prototype.registerProcessors = function () { | |||
var identity = function (x) { | |||
return x; | |||
}; | |||
var toString = function (x) { | |||
return x.toString(); | |||
}; | |||
if (typeof window !== 'undefined') { | |||
this.content.registerProcessor(['application/json; charset=utf-8', 'application/json', 'json'], { | |||
parser: identity, | |||
stringify: toString | |||
}); | |||
} else { | |||
this.Shred.registerProcessor(['application/json; charset=utf-8', 'application/json', 'json'], { | |||
parser: identity, | |||
stringify: toString | |||
}); | |||
} | |||
} | |||
ShredHttpClient.prototype.execute = function (obj) { | |||
if (!this.isInitialized) | |||
this.initShred(); | |||
var cb = obj.on, res; | |||
var transform = function (response) { | |||
var out = { | |||
headers: response._headers, | |||
url: response.request.url, | |||
method: response.request.method, | |||
status: response.status, | |||
data: response.content.data | |||
}; | |||
var headers = response._headers.normalized || response._headers; | |||
var contentType = (headers['content-type'] || headers['Content-Type'] || null) | |||
if (contentType != null) { | |||
if (contentType.indexOf('application/json') == 0 || contentType.indexOf('+json') > 0) { | |||
if (response.content.data && response.content.data !== '') | |||
try { | |||
out.obj = JSON.parse(response.content.data); | |||
} | |||
catch (ex) { | |||
// do not set out.obj | |||
log('unable to parse JSON content'); | |||
} | |||
else | |||
out.obj = {} | |||
} | |||
} | |||
return out; | |||
}; | |||
// Transform an error into a usable response-like object | |||
var transformError = function (error) { | |||
var out = { | |||
// Default to a status of 0 - The client will treat this as a generic permissions sort of error | |||
status: 0, | |||
data: error.message || error | |||
}; | |||
if (error.code) { | |||
out.obj = error; | |||
if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') { | |||
// We can tell the client that this should be treated as a missing resource and not as a permissions thing | |||
out.status = 404; | |||
} | |||
} | |||
return out; | |||
}; | |||
var res = { | |||
error: function (response) { | |||
if (obj) | |||
return cb.error(transform(response)); | |||
}, | |||
// Catch the Shred error raised when the request errors as it is made (i.e. No Response is coming) | |||
request_error: function (err) { | |||
if (obj) | |||
return cb.error(transformError(err)); | |||
}, | |||
response: function (response) { | |||
if (obj) | |||
return cb.response(transform(response)); | |||
} | |||
}; | |||
if (obj) { | |||
obj.on = res; | |||
} | |||
return this.shred.request(obj); | |||
}; | |||
/** | |||
* SwaggerAuthorizations applys the correct authorization to an operation being executed | |||
*/ | |||
var SwaggerAuthorizations = function (name, auth) { | |||
this.authz = {}; | |||
if(name && auth) { | |||
this.authz[name] = auth; | |||
} | |||
}; | |||
SwaggerAuthorizations.prototype.add = function (name, auth) { | |||
this.authz[name] = auth; | |||
return auth; | |||
}; | |||
SwaggerAuthorizations.prototype.remove = function (name) { | |||
return delete this.authz[name]; | |||
}; | |||
SwaggerAuthorizations.prototype.apply = function (obj, authorizations) { | |||
var status = null; | |||
var key, value, result; | |||
// if the "authorizations" key is undefined, or has an empty array, add all keys | |||
if (typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) { | |||
for (key in this.authz) { | |||
value = this.authz[key]; | |||
result = value.apply(obj, authorizations); | |||
if (result === true) | |||
status = true; | |||
} | |||
} | |||
else { | |||
for (name in authorizations) { | |||
for (key in this.authz) { | |||
if (key == name) { | |||
value = this.authz[key]; | |||
result = value.apply(obj, authorizations); | |||
if (result === true) | |||
status = true; | |||
} | |||
} | |||
} | |||
} | |||
return status; | |||
}; | |||
/** | |||
* ApiKeyAuthorization allows a query param or header to be injected | |||
*/ | |||
var ApiKeyAuthorization = function (name, value, type, delimiter) { | |||
this.name = name; | |||
this.value = value; | |||
this.type = type; | |||
this.delimiter = delimiter; | |||
}; | |||
ApiKeyAuthorization.prototype.apply = function (obj) { | |||
if (this.type === 'query') { | |||
if (obj.url.indexOf('?') > 0) | |||
obj.url = obj.url + '&' + this.name + '=' + this.value; | |||
else | |||
obj.url = obj.url + '?' + this.name + '=' + this.value; | |||
return true; | |||
} else if (this.type === 'header') { | |||
if (typeof obj.headers[this.name] !== 'undefined') { | |||
if (typeof this.delimiter !== 'undefined') | |||
obj.headers[this.name] = obj.headers[this.name] + this.delimiter + this.value; | |||
} | |||
else | |||
obj.headers[this.name] = this.value; | |||
return true; | |||
} | |||
}; | |||
/** | |||
* Password Authorization is a basic auth implementation | |||
*/ | |||
var PasswordAuthorization = function (name, username, password) { | |||
this.name = name; | |||
this.username = username; | |||
this.password = password; | |||
this._btoa = null; | |||
if (typeof window !== 'undefined') | |||
this._btoa = btoa; | |||
else | |||
this._btoa = require('btoa'); | |||
}; | |||
PasswordAuthorization.prototype.apply = function (obj) { | |||
var base64encoder = this._btoa; | |||
obj.headers['Authorization'] = 'Basic ' + base64encoder(this.username + ':' + this.password); | |||
return true; | |||
}; | |||
var SwaggerClient = function(url, options) { | |||
this.isBuilt = false; | |||
this.url = null; | |||
@@ -2002,6 +1670,7 @@ SwaggerClient.prototype.buildFromSpec = function(response) { | |||
if(typeof operationGroup === 'undefined') { | |||
this[tag] = []; | |||
operationGroup = this[tag]; | |||
operationGroup.operations = {}; | |||
operationGroup.label = tag; | |||
operationGroup.apis = []; | |||
this[tag].help = this.help.bind(operationGroup); | |||
@@ -2010,6 +1679,7 @@ SwaggerClient.prototype.buildFromSpec = function(response) { | |||
operationGroup[operationId] = operationObject.execute.bind(operationObject); | |||
operationGroup[operationId].help = operationObject.help.bind(operationObject); | |||
operationGroup.apis.push(operationObject); | |||
operationGroup.operations[operationId] = operationObject; | |||
// legacy UI feature | |||
var j; | |||
@@ -2061,16 +1731,8 @@ SwaggerClient.prototype.tagFromLabel = function(label) { | |||
}; | |||
SwaggerClient.prototype.idFromOp = function(path, httpMethod, op) { | |||
if(typeof op.operationId !== 'undefined') { | |||
return (op.operationId); | |||
} | |||
else { | |||
return path.substring(1) | |||
.replace(/\//g, "_") | |||
.replace(/\{/g, "") | |||
.replace(/\}/g, "") | |||
.replace(/\./g, "_") + "_" + httpMethod; | |||
} | |||
var opId = op.operationId || (path.substring(1) + '_' + httpMethod); | |||
return opId.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()\+\s]/g,'_'); | |||
}; | |||
SwaggerClient.prototype.fail = function(message) { | |||
@@ -2093,6 +1755,7 @@ var Operation = function(parent, operationId, httpMethod, path, args, definition | |||
parent = parent||{}; | |||
args = args||{}; | |||
this.operations = {}; | |||
this.operation = args; | |||
this.deprecated = args.deprecated; | |||
this.consumes = args.consumes; | |||
@@ -2112,6 +1775,7 @@ var Operation = function(parent, operationId, httpMethod, path, args, definition | |||
this.security = args.security; | |||
this.authorizations = args.security; | |||
this.description = args.description; | |||
this.useJQuery = parent.useJQuery; | |||
var i; | |||
for(i = 0; i < this.parameters.length; i++) { | |||
@@ -2240,12 +1904,12 @@ Operation.prototype.getType = function (param) { | |||
if(param.items) | |||
str = this.getType(param.items); | |||
} | |||
if(param['$ref']) | |||
str = param['$ref']; | |||
if(param.$ref) | |||
str = param.$ref; | |||
var schema = param.schema; | |||
if(schema) { | |||
var ref = schema['$ref']; | |||
var ref = schema.$ref; | |||
if(ref) { | |||
ref = simpleRef(ref); | |||
if(isArray) | |||
@@ -2263,12 +1927,13 @@ Operation.prototype.getType = function (param) { | |||
}; | |||
Operation.prototype.resolveModel = function (schema, definitions) { | |||
if(typeof schema['$ref'] !== 'undefined') { | |||
var ref = schema['$ref']; | |||
if(typeof schema.$ref !== 'undefined') { | |||
var ref = schema.$ref; | |||
if(ref.indexOf('#/definitions/') == 0) | |||
ref = ref.substring('#/definitions/'.length); | |||
if(definitions[ref]) | |||
if(definitions[ref]) { | |||
return new Model(ref, definitions[ref]); | |||
} | |||
} | |||
if(schema.type === 'array') | |||
return new ArrayModel(schema); | |||
@@ -2402,8 +2067,11 @@ Operation.prototype.getBody = function(headers, args) { | |||
for(var i = 0; i < this.parameters.length; i++) { | |||
var param = this.parameters[i]; | |||
if(typeof args[param.name] !== 'undefined') { | |||
if (param.in === 'body') | |||
if (param.in === 'body') { | |||
body = args[param.name]; | |||
} else if(param.in === 'formData') { | |||
formParams[param.name] = args[param.name]; | |||
} | |||
} | |||
} | |||
@@ -2484,6 +2152,10 @@ Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) { | |||
success = (success||log); | |||
error = (error||log); | |||
if(typeof opts.useJQuery === 'boolean') { | |||
this.useJQuery = opts.useJQuery; | |||
} | |||
var missingParams = this.getMissingParams(args); | |||
if(missingParams.length > 0) { | |||
var message = 'missing required params: ' + missingParams; | |||
@@ -2497,7 +2169,7 @@ Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) { | |||
var obj = { | |||
url: url, | |||
method: this.method, | |||
method: this.method.toUpperCase(), | |||
body: body, | |||
useJQuery: this.useJQuery, | |||
headers: headers, | |||
@@ -2511,7 +2183,10 @@ Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) { | |||
} | |||
}; | |||
var status = e.authorizations.apply(obj, this.operation.security); | |||
new SwaggerHttp().execute(obj); | |||
if(opts.mock === true) | |||
return obj; | |||
else | |||
new SwaggerHttp().execute(obj); | |||
}; | |||
Operation.prototype.setContentTypes = function(args, opts) { | |||
@@ -2688,7 +2363,10 @@ var Model = function(name, definition) { | |||
this.definition = definition || {}; | |||
this.properties = []; | |||
var requiredFields = definition.required || []; | |||
if(definition.type === 'array') { | |||
var out = new ArrayModel(definition); | |||
return out; | |||
} | |||
var key; | |||
var props = definition.properties; | |||
if(props) { | |||
@@ -2698,7 +2376,7 @@ var Model = function(name, definition) { | |||
if(requiredFields.indexOf(key) >= 0) | |||
required = true; | |||
this.properties.push(new Property(key, property, required)); | |||
} | |||
} | |||
} | |||
}; | |||
@@ -2746,7 +2424,7 @@ Model.prototype.getMockSignature = function(modelsToIgnore) { | |||
var i; | |||
for (i = 0; i < this.properties.length; i++) { | |||
var prop = this.properties[i]; | |||
var ref = prop['$ref']; | |||
var ref = prop.$ref; | |||
var model = models[ref]; | |||
if (model && typeof modelsToIgnore[model.name] === 'undefined') { | |||
returnVal = returnVal + ('<br>' + model.getMockSignature(modelsToIgnore)); | |||
@@ -2758,11 +2436,11 @@ Model.prototype.getMockSignature = function(modelsToIgnore) { | |||
var Property = function(name, obj, required) { | |||
this.schema = obj; | |||
this.required = required; | |||
if(obj['$ref']) | |||
this['$ref'] = simpleRef(obj['$ref']); | |||
if(obj.$ref) | |||
this.$ref = simpleRef(obj.$ref); | |||
else if (obj.type === 'array') { | |||
if(obj.items['$ref']) | |||
this['$ref'] = simpleRef(obj.items['$ref']); | |||
if(obj.items.$ref) | |||
this.$ref = simpleRef(obj.items.$ref); | |||
else | |||
obj = obj.items; | |||
} | |||
@@ -2792,8 +2470,8 @@ Property.prototype.sampleValue = function(isArray, ignoredModels) { | |||
var type = getStringSignature(this.obj); | |||
var output; | |||
if(this['$ref']) { | |||
var refModelName = simpleRef(this['$ref']); | |||
if(this.$ref) { | |||
var refModelName = simpleRef(this.$ref); | |||
var refModel = models[refModelName]; | |||
if(refModel && typeof ignoredModels[type] === 'undefined') { | |||
ignoredModels[type] = this; | |||
@@ -2832,7 +2510,7 @@ Property.prototype.sampleValue = function(isArray, ignoredModels) { | |||
getStringSignature = function(obj) { | |||
var str = ''; | |||
if(obj.type === 'array') { | |||
obj = (obj.items || obj['$ref'] || {}); | |||
obj = (obj.items || obj.$ref || {}); | |||
str += 'Array['; | |||
} | |||
if(obj.type === 'integer' && obj.format === 'int32') | |||
@@ -2853,8 +2531,8 @@ getStringSignature = function(obj) { | |||
str += 'double'; | |||
else if(obj.type === 'boolean') | |||
str += 'boolean'; | |||
else if(obj['$ref']) | |||
str += simpleRef(obj['$ref']); | |||
else if(obj.$ref) | |||
str += simpleRef(obj.$ref); | |||
else | |||
str += obj.type; | |||
if(obj.type === 'array') | |||
@@ -2879,7 +2557,7 @@ Property.prototype.toString = function() { | |||
str += ', <span class="propOptKey">optional</span>'; | |||
str += ')'; | |||
} | |||
else | |||
else | |||
str = this.name + ' (' + JSON.stringify(this.obj) + ')'; | |||
if(typeof this.description !== 'undefined') | |||
@@ -3019,17 +2697,12 @@ JQueryHttpClient.prototype.execute = function(obj) { | |||
var contentType = (headers["content-type"]||headers["Content-Type"]||null); | |||
if(contentType != null) { | |||
if(contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) { | |||
if(response.responseText && response.responseText !== "") { | |||
try { | |||
out.obj = JSON.parse(response.content.data); | |||
} | |||
catch (ex) { | |||
// do not set out.obj | |||
log ("unable to parse JSON content"); | |||
} | |||
try { | |||
out.obj = response.responseJSON || {}; | |||
} catch (ex) { | |||
// do not set out.obj | |||
log("unable to parse JSON content"); | |||
} | |||
else | |||
out.obj = {}; | |||
} | |||
} | |||
@@ -3163,6 +2836,7 @@ ShredHttpClient.prototype.execute = function(obj) { | |||
return this.shred.request(obj); | |||
}; | |||
var e = (typeof window !== 'undefined' ? window : exports); | |||
e.authorizations = new SwaggerAuthorizations(); | |||
@@ -2,7 +2,7 @@ | |||
<html> | |||
<head> | |||
<title>Swagger UI</title> | |||
<link href='//fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'/> | |||
<link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/> | |||
<link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/> | |||
<link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/> | |||
<link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/> | |||