215 lines
8.8 KiB
JavaScript
215 lines
8.8 KiB
JavaScript
exports.newFoundationsUtilitiesHttpResponses = function () {
|
|
|
|
let thisObject = {
|
|
respondWithFile: respondWithFile,
|
|
respondWithContent: respondWithContent,
|
|
respondWithImage: respondWithImage,
|
|
respondWithFont: respondWithFont,
|
|
respondWithEmptyArray: respondWithEmptyArray,
|
|
respondWithStyleSheet: respondWithStyleSheet,
|
|
respondWithProjectFolderFileList: respondWithProjectFolderFileList,
|
|
respondWithWebFile: respondWithWebFile
|
|
}
|
|
|
|
return thisObject
|
|
|
|
function respondWithFile(fileName, httpResponse) {
|
|
let fs = SA.nodeModules.fs
|
|
if (fileName.indexOf('undefined') > 0) {
|
|
console.log('[WRN] respondWithFile -> Received httpRequest for undefined file. ')
|
|
respondWithContent(undefined, httpResponse)
|
|
} else {
|
|
try {
|
|
fs.readFile(fileName, onFileRead)
|
|
|
|
function onFileRead(err, file) {
|
|
if (!err) {
|
|
respondWithContent(file.toString(), httpResponse)
|
|
} else {
|
|
//console.log('File requested not found: ' + fileName)
|
|
respondWithContent(undefined, httpResponse)
|
|
}
|
|
}
|
|
} catch (err) {
|
|
respondWithEmptyArray(httpResponse)
|
|
}
|
|
}
|
|
}
|
|
|
|
function respondWithContent(content, httpResponse, contentType) {
|
|
try {
|
|
httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
|
|
httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
|
|
httpResponse.setHeader('Expires', '0') // Proxies.
|
|
httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
|
|
|
|
if (content !== undefined) {
|
|
if (contentType !== undefined) {
|
|
httpResponse.writeHead(200, { 'Content-Type': contentType })
|
|
} else {
|
|
httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
|
|
}
|
|
httpResponse.write(content)
|
|
} else {
|
|
httpResponse.writeHead(404, { 'Content-Type': 'text/html' })
|
|
httpResponse.write('The specified key does not exist.')
|
|
}
|
|
httpResponse.end('\n')
|
|
} catch (err) {
|
|
respondWithEmptyArray(httpResponse)
|
|
}
|
|
}
|
|
|
|
function respondWithImage(fileName, httpResponse) {
|
|
let fs = SA.nodeModules.fs
|
|
fs.readFile(fileName, onFileRead)
|
|
|
|
function onFileRead(err, file) {
|
|
if (err) {
|
|
console.log('[ERROR] respondWithImage -> Image Not Found: ' + fileName + ' or Error = ' + err.stack)
|
|
return
|
|
}
|
|
|
|
httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
|
|
httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
|
|
httpResponse.setHeader('Expires', '0') // Proxies.
|
|
httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
|
|
|
|
httpResponse.writeHead(200, { 'Content-Type': 'image/png' })
|
|
httpResponse.end(file, 'binary')
|
|
}
|
|
}
|
|
|
|
function respondWithFont(fileName, httpResponse) {
|
|
let fs = SA.nodeModules.fs
|
|
fs.readFile(fileName, onFileRead)
|
|
|
|
function onFileRead(err, file) {
|
|
if (err) {
|
|
console.log('[ERROR] respondWithFont -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
|
|
return
|
|
}
|
|
httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
|
|
httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
|
|
httpResponse.setHeader('Expires', '0') // Proxies.
|
|
httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
|
|
|
|
if (fileName.indexOf('2') < 0) {
|
|
httpResponse.writeHead(200, { 'Content-Type': 'font/woff' })
|
|
} else {
|
|
httpResponse.writeHead(200, { 'Content-Type': 'font/woff2' })
|
|
}
|
|
httpResponse.end(file, 'binary')
|
|
}
|
|
}
|
|
|
|
function respondWithEmptyArray(httpResponse) {
|
|
httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
|
|
httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
|
|
httpResponse.setHeader('Expires', '0') // Proxies.
|
|
|
|
httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
|
|
httpResponse.write('[]')
|
|
httpResponse.end('\n')
|
|
}
|
|
|
|
function respondWithStyleSheet(httpResponse, pathToApp, fileName) {
|
|
let fs = SA.nodeModules.fs
|
|
let filePath = pathToApp + '/WebServer/css/' + fileName
|
|
fs.readFile(filePath, onFileRead)
|
|
|
|
function onFileRead(err, file) {
|
|
try {
|
|
let fileContent = file.toString()
|
|
|
|
SA.projects.foundations.utilities.httpResponses.respondWithContent(fileContent, httpResponse, 'text/css')
|
|
} catch (err) {
|
|
console.log('[ERROR] respondWithStyleSheet -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
|
|
}
|
|
}
|
|
}
|
|
|
|
function respondWithProjectFolderFileList(httpResponse, projectFolderName, rootObjectName) {
|
|
{
|
|
let allLibraries = []
|
|
let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
|
|
let projectsCount = 0
|
|
|
|
for (let i = 0; i < projects.length; i++) {
|
|
let project = projects[i]
|
|
|
|
let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + rootObjectName + '/' + projectFolderName
|
|
try {
|
|
let fs = SA.nodeModules.fs
|
|
fs.readdir(dirPath, onDirRead)
|
|
|
|
function onDirRead(err, fileList) {
|
|
let updatedFileList = []
|
|
if (err) {
|
|
/*
|
|
If we have a problem reading this folder we will assume that it is
|
|
because this project does not need this folder and that's it.
|
|
*/
|
|
} else {
|
|
for (let i = 0; i < fileList.length; i++) {
|
|
let name = fileList[i]
|
|
updatedFileList.push([project, name])
|
|
}
|
|
}
|
|
allLibraries = allLibraries.concat(updatedFileList)
|
|
projectsCount++
|
|
if (projectsCount === projects.length) {
|
|
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allLibraries), httpResponse)
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.log('[ERROR] returnProjectFolderFileList -> Error reading a directory content. filePath = ' + dirPath)
|
|
console.log('[ERROR] returnProjectFolderFileList -> err.stack = ' + err.stack)
|
|
|
|
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function respondWithWebFile(httpResponse, fileNameReceived, pathToApp) {
|
|
|
|
if (fileNameReceived === '') {
|
|
/*
|
|
When there is no endpoint specified we will respond with this app's Home Page.
|
|
*/
|
|
let fs = SA.nodeModules.fs
|
|
|
|
let fileName = pathToApp + '/WebServer/index.html'
|
|
|
|
fs.readFile(fileName, onFileRead)
|
|
|
|
function onFileRead(err, file) {
|
|
|
|
let fileContent = file.toString()
|
|
|
|
SA.projects.foundations.utilities.httpResponses.respondWithContent(fileContent, httpResponse)
|
|
}
|
|
} else {
|
|
/*
|
|
When there is a parameter but it does not match any of the available endpoints, we
|
|
will serve the file with the same name at at a location that depends on it's file extension.
|
|
*/
|
|
let completeFileName = fileNameReceived
|
|
let fileExtension = completeFileName.split('.')[1]
|
|
|
|
switch (fileExtension) {
|
|
case 'js': {
|
|
let path = pathToApp + '/UI/' + completeFileName
|
|
SA.projects.foundations.utilities.httpResponses.respondWithFile(path, httpResponse)
|
|
break
|
|
}
|
|
case 'css': {
|
|
SA.projects.foundations.utilities.httpResponses.respondWithStyleSheet(httpResponse, pathToApp, completeFileName)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |