Files
js-scripts/scripts/server.js
2025-04-05 16:57:26 +08:00

115 lines
4.2 KiB
JavaScript

#! /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 <port> <path>')
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();