feat: scripts
This commit is contained in:
114
scripts/server.js
Normal file
114
scripts/server.js
Normal file
@@ -0,0 +1,114 @@
|
||||
#! /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();
|
||||
Reference in New Issue
Block a user