223 lines
6.8 KiB
JavaScript
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 };
|
|
} |