blob: 01136799b34cd7a99a7bbb47d3aa90d567208049 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
/**
* App.HttpClient perform an ajax request
*/
App.HttpClient = Em.Object.create({
/**
*
* @param jqXHR
* @param textStatus
* @param errorThrown
* @param url api that invoked this callback function
*/
defaultErrorHandler: function (jqXHR, textStatus, errorThrown, url) {
try {
var json = $.parseJSON(jqXHR.responseText);
} catch (err) { }
App.ajax.defaultErrorHandler(jqXHR, url);
if (json) {
Em.assert("HttpClient:", json);
}
else {
if (!$.mocho) { // don't use this assert on tests
Em.assert("HttpClient:", errorThrown);
}
}
},
/**
* @param {string} url
* @param {Object} ajaxOptions
* @param {App.ServerDataMapper} mapper - json processor
* @param {boolean} isGetAsPost - if true, do POST-request equal to GET-request but with some params put to body
* @param {callback} errorHandler
*/
request: function (url, ajaxOptions, mapper, errorHandler, isGetAsPost) {
if (!errorHandler) {
errorHandler = this.defaultErrorHandler;
}
var xhr = new XMLHttpRequest(),
curTime = App.dateTime(),
method = isGetAsPost ? 'POST': 'GET',
params = isGetAsPost ? JSON.stringify({
"RequestInfo": {"query" : ajaxOptions.params}
}) : null;
xhr.open(method, url + (url.indexOf('?') >= 0 ? '&_=' : '?_=') + curTime, true);
if (isGetAsPost) {
xhr.setRequestHeader("X-Http-Method-Override", "GET");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
}
xhr.send(params);
this.onReady(xhr, "", ajaxOptions, mapper, errorHandler, url);
},
/**
This function checks if we get response from server
Not using onreadystatechange cuz of possible closure
*/
onReady: function (xhr, tm, tmp_val, mapper, errorHandler, url) {
var self = this;
clearTimeout(tm);
var timeout = setTimeout(function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var response = $.parseJSON(xhr.responseText);
if (tmp_val.beforeMap) {
tmp_val.beforeMap.call(self, response);
}
mapper.map(response);
tmp_val.complete.call(self);
xhr.abort();
} else {
errorHandler(xhr, "error", xhr.statusText, url);
}
tmp_val = null;
xhr = null;
clearTimeout(timeout);
timeout = null;
}
else {
self.onReady(xhr, timeout, tmp_val, mapper, errorHandler, url);
}
}, 10);
},
/**
* @param {string} url
* @param {App.ServerDataMapper} mapper - json processor
* @param {Object} data - ajax data property
* @param {callback} errorHandler
* @param {number} interval - frequency request
*/
get: function (url, mapper, data, errorHandler, interval) {
if (!errorHandler && data.error) {
errorHandler = data.error;
}
var client = this,
request = function () {
var isGetAsPost = Boolean(data.doGetAsPost && !App.get('testMode'));
client.request(url, data, mapper, errorHandler, isGetAsPost);
url = null;
data = null;
mapper = null;
errorHandler = null;
};
interval = "" + interval;
if (interval.match(/\d+/)) {
$.periodic({period: interval}, request);
}
else {
request();
}
},
/**
* @param {string} url
* @param {Object} data - ajax data property
* @param {App.ServerDataMapper} mapper - json processor
* @param {callback} errorHandler
* @param {number} interval - frequency request
*/
post: function (url, data, mapper, errorHandler, interval) {
this.get.apply(this, arguments);
}
});