dl
Version:
DreamLab Libs
185 lines (161 loc) • 7.17 kB
JavaScript
var Class = require('core').Class;
var CdfPage = require('./CdfPage.js').CdfPage;
var CdfBlocks = require('./CdfBlocks.js').CdfBlocks;
var Request = require('core').http.Request;
var Loader = require('core').http.Loader;
var OpalCredentialsProvider = require('../opal/OpalCredentialsProvider.js').OpalCredentialsProvider;
var CdfApplicationContainer = function () {
this.initialize = function (name) {
this._applications = {};
this._revDeps = {};
this._name = name;
};
this.add = function (application) {
var block = application.name;
this._applications[block] = application;
this._revDeps[application.src] = application.name; //megahack
};
this.get = function (block) {
if (this._applications.hasOwnProperty(block)) {
return this._applications[block];
} else {
return null;
}
};
this.getApplications = function () {
var applications = [];
for (var i in this._applications) {
if (this._applications.hasOwnProperty(i)) {
applications.push(this._applications[i]);
}
}
return applications;
};
this.getName = function () {
return this._name;
};
this.getUrl = function () {
for (var application in this._applications) {
if (this._applications.hasOwnProperty(application)) {
return this._applications[application].controller;
}
}
throw 'Add some application to CdfApplicationContainer then request for URL';
};
this.getCredential = function () {
for (var application in this._applications) {
if (this._applications.hasOwnProperty(application)) {
return this._applications[application].credential;
}
}
return null;
};
this.fetchApplication = function (request, logger, cb) {
this.callback = cb;
var that = this,
req = new Request(request),
loader = new Loader();
var loaderTimeStart = 0;
var onError = function (e) {
var loaderTimeEnd = Date.now() - loaderTimeStart;
console.info('ES/CdfApplicationContainer/BACKEND: tt=%s code=%s len=%s method=%s host=%s url=%s', loaderTimeEnd, 0, 0, req.getMethod(), req.getHeader('host'), req.getUrl());
cb(e, null);
};
req.setUrl(this.getUrl());
req.setHost(req.getConnectionHost());
if (Object.keys(req.getQuery()).length == 0) {
req.setQuery(request.getQuery());
}
req.removeHeader("accept-encoding");
req.removeHeader("if-modified-since");
req.removeHeader("if-none-match");
req.removeHeader("x-onet-regenerate");
req.removeHeader('range');
req.setCookie("onet_nolajtredir=1");
if (process.env['OPAL_IDENTITY']) {
req.setHeader('x-onet-app', process.env['OPAL_IDENTITY'], true);
}
// oznaczamy ze request poszedl z CDFApplication
var userAgent = req.getHeader('user-agent');
if (userAgent) {
req.setHeader('user-agent', userAgent + ' CDF_APP', true);
} else {
req.setHeader('user-agent', 'CDF_APP', true);
}
loader.addEventListener(
Loader.Event.LOADED,
function (e) {
var response = e.data,
content = response.getHeader('content-type');
var loaderTimeEnd = Date.now() - loaderTimeStart;
console.info('ES/CdfApplicationContainer/BACKEND: tt=%s code=%s len=%s method=%s host=%s url=%s', loaderTimeEnd, response.getStatusCode(), response.getBody().length(), req.getMethod(), req.getHeader('host'), req.getUrl());
if (logger) {
logger.parse(response.getHeaders(), "CdfApplication(" + that.getUrl()+')');
}
if (content && content.indexOf('text/html') > -1 && response.getStatusCode() == 200) {
var body = e.data.getBody(), page;
try {
page = new (require('./CdfPage.js').CdfPage)(body.toUTF8String());
} catch (e) {
console.error('Unable to parse page', e);
cb(null, response);
return;
}
var blocks = page.blocks._models, newBlocks = new CdfBlocks();
if (blocks.length) {
for (var i=0,max=blocks.length; i<max; i++) { // magia, podmieniamy tutaj tokeny i nazwy dla bloków
var appname = that._revDeps[blocks[i].name];
var app = that._applications[appname];
if (!app) {
continue;
}
blocks[i].name = app.name;
blocks[i].token = app.token;
//blocks[i].cache = app.cache;
app.cache = blocks[i].cache;
newBlocks.add(blocks[i]);
}
cb(null, newBlocks);
} else {
cb(null, response);
}
} else {
cb(null, response);
}
}
);
loader.addEventListener(Loader.Event.ERROR, onError);
loader.setFollowRedirects(false);
loader.setTimeout(10000);
this._handleAuthorization(this.getCredential(), req, function (error) {
//error ? onError(error) : loader.load(req);
if (error) {
onError(error);
} else {
loaderTimeStart = Date.now();
loader.load(req);
}
});
};
this._handleAuthorization = function (credential, request, callback) {
if (!credential) {
callback(null);
return;
}
this._credentialProvider = new OpalCredentialsProvider(credential, process.env.OPAL_IDENTITY);
this._credentialProvider.get(function (error, cred) {
if (error) {
callback(error);
} else {
if (cred.type == 'Basic') {
var auth_string = [cred.login, cred.password].join(':');
var authorization = [cred.type, (new Buffer(auth_string).toString('base64'))].join(' ');
request.setHeader('authorization', authorization, true);
}
callback(null);
}
});
};
};
CdfApplicationContainer = new Class(new CdfApplicationContainer());
exports.CdfApplicationContainer = CdfApplicationContainer;