UNPKG

dl

Version:

DreamLab Libs

185 lines (161 loc) 7.17 kB
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;