blob: 377e77c9da417ebff4773577dd1d3ac2d8545ea5 [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.
*/
// Note that I'm still not a JavaScript guru...but this is
// just prototype/demo code ;-)
var request = require('request')
var ContentRenderer = require('./content-renderer.js')
var Handlebars = require('handlebars')
var ORIGIN_SUFFIX = '.rakam.json'
var contentRenderer = new ContentRenderer();
var templateSource = '\
<html>\
<head>\
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css">\
<style type="text/css">\
body{\
max-width: 9999px;\
}\
.debug {\
font-size:80%;\
color:gray;\
}\
ul {\
list-style-type: none;\
}\
.navigation li,\
.content li {\
margin:0;\
padding:0;\
}\
.content,\
.raw pre,\
.navigation {\
margin-left:2em;\
}\
.navigation {\
background-color: #CCFFFF;\
}\
.content {\
background-color: #FFFFCC;\
}\
.raw pre {\
background-color: #EEE;\
}\
.nested {\
margin-left:1em;\
}\
</style>\
</head>\
<body> \
\
<h1>Sling Remote Content API :: HTTP proxying renderer</h1> \
<div class="debug">\
This is proxying content from a Sling instance at <a href="{{proxyInfo.origin}}">{{proxyInfo.origin}}</a>\
where the document-oriented <a href="https://github.com/apache/sling-whiteboard/tree/master/remote-content-api">Sling Remote Content API</a> must be installed.\
<br>Source code is found in the <a href="https://github.com/apache/sling-whiteboard/tree/master/remote-content-api/openwhisk-rendering">openwhisk-rendering</a> module there<br>\
{{proxyInfo.contentRendererInfo}}<br>\
</div>\
\
<h2>Navigation</h2>\
<div class="navigation">\
\
Parent\
<ul>\
<li><a href="{{navigation.parent}}">{{navigation.parent}}</a></li>\
</ul>\
Children\
<ul>\
{{#each navigation.children}} \
<li><a href="{{this.url}}">{{this.path}}</a></li>\
{{/each}} \
</ul>\
</div>\
\
<h2>Rendered Content</h2>\
<div class="content">\
{{{renderedContent}}}\
\
</div>\
<h2>Raw Content</h2>\
Acquired from <a href="{{proxyInfo.sourceURL}}">{{proxyInfo.sourceURL}}</a>\
<div class="raw">\
<pre>{{rawJSON}}</pre>\
</div>\
</body></html>'
var template = Handlebars.compile(templateSource);
var origin = "ORIGIN_NOT_SET"
// TODO get this from the environment
var myRootURL = "ROOT_URL_NOT_SET"
function convertUrl(url) {
return url.replace(origin, myRootURL).replace(ORIGIN_SUFFIX, "")
}
function convertUrls(navigation) {
navigation.self = convertUrl(navigation.self)
navigation.parent = convertUrl(navigation.parent)
for(const i in navigation.children) {
var c = navigation.children[i]
c.url = convertUrl(c.url)
}
}
function main (params) {
var path = params.__ow_path
if(path == "") {
path = "/"
}
origin = params.ORIGIN
myRootURL = params.ROOT_URL
var sourceURL = `${origin}${path}${ORIGIN_SUFFIX}`
console.log(`Proxying to ${sourceURL}, converting links to point to ${myRootURL}`)
var options = {
url: sourceURL,
json: true
}
return new Promise(function (resolve, reject) {
request(options, function (err, resp) {
if (err) {
// request failed
console.log(err)
return resolve({ statusCode:500, body:err})
}
if(resp.statusCode != 200) {
// service error
console.log(`service error ${resp.statusCode}: ${resp.body.error}`)
return resolve({ statusCode:resp.statusCode, body:resp.body.error})
}
var data = resp.body
convertUrls(data.navigation)
data.rawJSON = JSON.stringify(resp.body, null, 2)
data.renderedContent = contentRenderer.render(data.content)
data.proxyInfo = {
origin : origin,
sourceURL : sourceURL,
contentRendererInfo : contentRenderer.info()
}
var html = template(data);
console.log(`Returning ${html}`)
return resolve({ body: html, headers:{ 'Content-Type': 'text/html'}})
})
})
}
// This is for command-line testing
// like node -e "require('./http-rendering-proxy.js').main({ ORIGIN:'http://localhost:8080', __ow_path : '/content' })"
module.exports.main = main