HTTPBindingClient.prototype.get = function()

in modules/js/htdocs/component.js [358:458]


HTTPBindingClient.prototype.get = function(id, cb, mode) {
    var u = id? (this.uri? this.uri + '/' + id : id) : this.uri;
    var hascb = cb? true : false;

    // Get from local storage first
    var item;
    if(mode != 'remote') {
        item = HTTPBindingClient.getCacheItem(u);
        if(item && item != '') {
            if(!hascb)
                return item;

            // Pass local result to callback
            cb(item);
        }
    }

    // Call asynchronously with a callback
    if(hascb) {
        return HTTPBindingClient.scheduleAsyncRequest(function getRequest(http, done) {
            http.open('GET', u, true);
            http.setRequestHeader('Accept', '*/*');
            http.setRequestHeader('X-Cache-Control', 'no-cache');
            http.onreadystatechange = function() {
                if(http.readyState == 4) {

                    // Pass result if different from local result
                    //debug('readystate', http.readyState, 'status', http.status, 'headers', http.getAllResponseHeaders());
                    if(http.status == 200) {
                        var ct = http.getResponseHeader('Content-Type');
                        if(http.responseText == '' || !ct || ct == '') {

                            // Report empty response
                            error('get received empty response', 'url', u);
                            cb(undefined, new Error('500 No-Content'));
                            return done();

                        } else if(!item || http.responseText != item) {

                            // Store retrieved entry in local storage
                            //debug('received response', 'url', u, 'response', http.responseText);
                            if(http.responseText != null)
                                HTTPBindingClient.setCacheItem(u, http.responseText);
                            cb(http.responseText);
                            return done();
                        }
                    } else if (http.status == 403) {

                        // Redirect to login page
                        error('get received 403 response', 'url', u);
                        var le = new Error('' + http.status + ' ' + http.statusText);
                        if(window.onloginredirect)
                            window.onloginredirect(le);
                        cb(undefined, le);
                        return done();

                    } else if(!http.aborted) {

                        // Pass exception if we didn't have a local result
                        error('get received error', 'url', u, 'status', http.status, http.statusText);
                        if(!item) {
                            cb(undefined, new Error('' + http.status + ' ' + http.statusText));
                            return done();
                        }
                    }
                    return done();
                }
            };

            // Send the request
            http.send(null);
            return true;
        }, true);
    }

    // Call synchronously and return the result or exception
    var http = new XMLHttpRequest();
    http.open('GET', u, false);
    http.setRequestHeader('Accept', '*/*');
    http.setRequestHeader('X-Cache-Control', 'no-cache');
    http.send(null);
    if(http.status == 200) {
        var ct = http.getResponseHeader('Content-Type');
        if(http.responseText == '' || !ct || ct == '') {
            // Report empty response
            error('get received empty response', 'url', u);
            throw new Error('500 No Content');
        }
        return http.responseText;
    }
    if(http.status == 403) {
        // Redirect to login page
        error('get received 403 response', 'url', u);
        var le = new Error('' + http.status + ' ' + http.statusText);
        if(window.onloginredirect)
            window.onloginredirect(le);
        throw le;
    }
    error('get received error', 'url', u, 'status', http.status, http.statusText);
    throw new Error('' + http.status + ' ' + http.statusText);
};