#! /usr/bin/env runjs requireJS('component-httpserver.js'); var FileInputStream = java.io.FileInputStream; var IOUtil = Packages.me.hatter.tools.commons.io.IOUtil; var getContentTypeByExt = (ext) => { if (ext == null) { return 'application/octet-stream' } var lowerExt = ext.toLowerCase(); if ($$.asList('jpg', 'jpe', 'jpeg').contains(lowerExt)) { return 'image/jpeg'; } else if ($$.asList('png').contains(lowerExt)) { return 'image/png'; } else if ($$.asList('txt', 'text', 'pem').contains(lowerExt)) { return 'text/plain'; } else if ($$.asList('htm', 'html').contains(lowerExt)) { return 'text/html'; } else if ($$.asList('js').contains(lowerExt)) { return 'text/javascript'; } else if ($$.asList('json').contains(lowerExt)) { return 'application/json'; } else if ($$.asList('doc').contains(lowerExt)) { return 'application/msword'; } else if ($$.asList('xls').contains(lowerExt)) { return 'application/vnd.ms-excel'; } else if ($$.asList('ppt').contains(lowerExt)) { return 'application/vnd.ms-powerpoint'; } else if ($$.asList('pdf').contains(lowerExt)) { return 'application/pdf'; } else if ($$.asList('crt').contains(lowerExt)) { return 'application/x-x509-ca-cert'; } else if ($$.asList('mp3').contains(lowerExt)) { return 'audio/mp3'; } else if ($$.asList('mp4').contains(lowerExt)) { return 'video/mpeg4'; } else if ($$.asList('xml').contains(lowerExt)) { return 'text/xml'; } // Unknow ext. return 'application/octet-stream'; }; var main = () => { if (($ARGS == null) || ($ARGS.length < 2)) { println('server.js - Run server.'); println(); println('ERROR: NO arguments assigned!') println('CMD: server.js ') println(' port server port') println(' path server path') return; } var port = parseInt($ARGS[0]); var path = $STR($ARGS[1]); if (isNaN(port) || (port <= 0) || (port > 65535)) { println('ERROR: port error: ' + port) return; } var filePath = $$.file(path); if (!filePath.exists() || !filePath.isDirectory()) { println('ERROR: path not exists or not a directory: ' + path) return; } serveHTTP(port, (httpExchange) => { var requestURI = httpExchange.getRequestURI().toString(); println('Request received: ' + requestURI); try { var requestPath = requestURI.startsWith('/')? requestURI.substring(1): requestURI; var f = $$.file(filePath, requestPath); if (!f.exists()) { return { "status": 404, "text": "404\n\nResource not found: " + requestURI + '\n' }; } if (f.isDirectory()) { if (!requestURI.endsWith('/')) { return { "status": 302, "headers": [["Location", requestURI + '/' ]], "bytes": $$.byteArray(0) }; } var result = []; $ARRAY(f.list()).forEach((fn) => { result.push(fn); }); return {"text": "Directory listing:\n\n" + result.join('\n') + '\n' }; } var fileExtIndex = f.getName().lastIndexOf('.'); var fileExt = (fileExtIndex > 0)? f.getName().substring(fileExtIndex + 1): null; var fileLength = f.length(); httpExchange.sendResponseHeaders(200, 0); var responseHeaders = httpExchange.getResponseHeaders(); responseHeaders.set('Content-Type', getContentTypeByExt(fileExt)); responseHeaders.set('Content-Length', fileLength); var response = httpExchange.getResponseBody(); var fis = new FileInputStream(f); IOUtil.copy(fis, response) IOUtil.closeQuietly(fis); IOUtil.closeQuietly(response); } catch(e) { if (e && e.printStackTrace) { e.printStackTrace(); } else { println('[ERROR] Exception: ' + e); } return { "status": "500", "text": "[ERROR] Exception: " + e + '\n' }; } }); }; main();