EnVisageOnline/Main/Source/PrevuWebAPI/Scripts/WebApiTestClient.js

223 lines
6.8 KiB
JavaScript

var testClientModel;
var emptyTestClientModel =
{
HttpMethod: '',
UriPathTemplate: '',
Samples: {},
UriParameters: [],
BaseAddress: '/'
};
(function () {
function BuildUriPath(template, uriParameters) {
var path = template;
for (var i in uriParameters) {
var parameter = uriParameters[i];
var variableName = '{' + parameter.name + '}';
var parameterValue = parameter.value();
if (parameterValue != "") {
path = path.replace(variableName, parameterValue);
}
}
return path;
}
function TestClientViewModel(data) {
var self = this;
self.HttpMethod = ko.observable(data.HttpMethod);
self.UriPathTemplate = data.UriPathTemplate;
self.UriPath = ko.observable(self.UriPathTemplate);
self.UriParameters = new Array();
for (var i in data.UriParameters) {
var uriParameter = data.UriParameters[i];
var uriParameterValue = ko.observable(uriParameter.value);
uriParameterValue.subscribe(function () {
self.UriPath(BuildUriPath(self.UriPathTemplate, self.UriParameters));
});
self.UriParameters.push({ name: uriParameter.name, value: uriParameterValue });
}
self.RequestHeaders = ko.observableArray();
self.RequestMediaType = ko.observable();
var sampleTypes = new Array();
for (var index in data.Samples) {
sampleTypes.push(index);
};
self.SampleTypes = sampleTypes;
self.ShouldShowBody = ko.observable(sampleTypes.length > 0);
self.RequestBody = ko.observable();
self.RequestMediaType.subscribe(function () {
self.RequestBody(decodeSample(data.Samples[self.RequestMediaType()]) || "");
var headers = self.RequestHeaders;
var mediaType = self.RequestMediaType();
if (mediaType && mediaType != "") {
addOrReplaceHeader(headers, "content-type", mediaType);
}
});
self.RequestBody.subscribe(function () {
var headers = self.RequestHeaders;
var contentLengh = self.RequestBody().length;
addOrReplaceHeader(headers, "content-length", contentLengh);
});
self.addHeader = function () {
self.RequestHeaders.splice(0, 0, { name: "", value: "" });
};
self.removeHeader = function (header) {
self.RequestHeaders.remove(header);
};
self.response = ko.observable();
self.sendRequest = function () {
var uriPath = self.UriPath();
var http = "http://";
var https = "https://";
// Just take the entire uriPath if it's an absolute URI.
var uri = (uriPath.slice(0, http.length) == http || uriPath.slice(0, https.length) == https) ?
uriPath :
data.BaseAddress + uriPath;
var httpMethod = self.HttpMethod();
var headers = self.RequestHeaders();
var requestBody = self.ShouldShowBody() ? self.RequestBody() : null;
SendRequest(httpMethod, uri, headers, requestBody, function (httpRequest) {
var httpResponse = getHttpResponse(httpRequest);
self.response(httpResponse);
$("#testClientResponseDialog").dialog("open");
});
};
$("#testClientDialog").dialog({
autoOpen: false,
height: "auto",
width: "700",
modal: true,
open: function () {
jQuery('.ui-widget-overlay').bind('click', function () {
jQuery('#testClientDialog').dialog('close');
})
},
buttons: {
"Send": function () {
self.sendRequest();
}
}
});
$("#testClientResponseDialog").dialog({
autoOpen: false,
height: "auto",
width: "550",
modal: true,
open: function () {
jQuery('.ui-widget-overlay').bind('click', function () {
jQuery('#testClientResponseDialog').dialog('close');
})
}
});
$("#testClientButton").click(function () {
$("#testClientDialog").dialog("open");
});
}
// Initiate the Knockout bindings
var initialModel = testClientModel || emptyTestClientModel;
ko.applyBindings(new TestClientViewModel(initialModel));
})();
function decodeSample(sampleString) {
return unescape(sampleString).replace(/\+/gi, " ").replace(/\r\n/gi, "\n");
}
function addOrReplaceHeader(headers, headerName, headerValue) {
var headerList = headers();
for (var i in headerList) {
if (headerList[i].name.toLowerCase() == headerName) {
headers.replace(headerList[i], { name: headerList[i].name, value: headerValue });
return;
}
}
headers.push({ name: headerName, value: headerValue });
}
function SendRequest(httpMethod, url, requestHeaders, requestBody, handleResponse) {
if (httpMethod.length == 0) {
alert("HTTP Method should not be empty");
return false;
}
if (url.length == 0) {
alert("Url should not be empty");
return false;
}
var httpRequest = new XMLHttpRequest();
try {
httpRequest.open(httpMethod, encodeURI(url), false);
}
catch (e) {
alert("Cannot send request. Check the security setting of your browser if you are sending request to a different domain.");
return false;
}
try {
for (var i in requestHeaders) {
var header = requestHeaders[i];
httpRequest.setRequestHeader(header.name, header.value);
}
} catch (e) {
alert("Invalid header.");
return false;
}
httpRequest.onreadystatechange = function () {
switch (this.readyState) {
case 4:
handleResponse(httpRequest);
break;
default:
break;
}
}
httpRequest.ontimeout = function () {
alert("Request timed out.");
}
try {
httpRequest.send(requestBody);
} catch (e) {
alert(e);
return false;
}
return true;
}
function getHttpResponse(httpRequest) {
var statusCode = httpRequest.status;
var statusText = httpRequest.statusText;
var responseHeaders = httpRequest.getAllResponseHeaders();
var rawResponse = httpRequest.responseText;
// IE - #1450: sometimes returns 1223 when it should be 204
if (statusCode === 1223) {
statusCode = 204;
statusText = "No Content";
}
var responseStatus = statusCode + "/" + statusText;
return { status: responseStatus, headers: responseHeaders, content: rawResponse };
}