var Lourah = Lourah || {};
Activity.importScript(Lourah.jsFramework.parentDir() + "/Lourah.http.util.js");
(function () {
Lourah.http = Lourah.http || {};
if (Lourah.http.Server) return;
var Synchronizer = Packages.org.mozilla.javascript.Synchronizer;
function HttpExchange(method
,uri
,protocol
,requestMessage
,responseMessage) {
this.getMethod = () => method;
this.getUri = () => uri;
this.getProtocol = () => protocol;
this.getRequestMessage = () => requestMessage;
this.getResponseMessage = () => responseMessage;
this.toString = () => {
var s = "Exchange::{" + [
method
,uri
,protocol
,requestMessage
,responseMessage
]
+ "}::Exchange";
return s;
}
}
var HttpServer = (function () {
function PublicHttpServer() {
throw new Error("the constructor is private, please use HttpServer.create(...)");
}
var HttpServer = function(inetSocketAddr, backlog) {
var executor = null;
var serverSocket = -1;
var pathHandlers;
var pathSorted;
var self = this;
this.createContext = path => {
console.log("createContext::" + path);
}
this.setExecutor = (e) => {
executor = e;
}
this.getExecutor = () => executor;
this.setPathHandlers = new Synchronizer(ph => {
pathHandlers = ph;
pathSorted = Object.keys(ph).sort((a, b) => b.length - a.length);
});
var serverProcessor = new ServerProcessor(inetSocketAddr,backlog, executor);
var threadServer = new java.lang.Thread(
serverProcessor
);
function uri2js(juri) {
var uri = "" + juri;
var iQuery = uri.indexOf('?');
if (iQuery === -1) {
return { file: decodeURI(uri) + "/", query: {} };
}
var ret = {};
ret.file = decodeURI(uri.substring(0, iQuery)) + "/";
ret.query = {};
var query = uri.substring(iQuery + 1);
var params = query.split('&');
for(var i = 0; i < params.length; i++) {
param = params[i].split('=');
ret.query[decodeURI(param[0])] = decodeURI(param[1]);
}
return ret;
}
function ClientProcessor(client) {
this.run = () => processClient(client);
}
function ServerProcessor() {
var stopped = true;
var serverSocket;
this.setStopped = new Synchronizer(
(stop) => {stopped = stop
if (stop && serverSocket) {
try {
} catch(e) {
console.log("ServerProcessor::setStopped::" + e + "::" + e.stack);
}
}
}
);
this.getStopped = new Synchronizer(
() => stopped
);
/*
this.run_0 = () => {
var attempt = "none";
try {
attempt = "create serverSocket";
serverSocket = new java.net.ServerSocket(inetSocketAddr.getPort(), backlog);
console.log("started");
while(!stopped) {
attempt = "accept clientSocket";
//console.log("wait for accept");
var clientSocket = serverSocket.accept();
//console.log("accepted");
if (java.lang.Thread.currentThread().isInterrupted()) {
serverSocket.close();
stopped = true;
console.log("threadServer::!!!INTERRUPTED!!!");
}
executor.execute(
new ClientProcessor(clientSocket)
);
}
attempt = "closing serverSocket";
serverSocket.close();
attempt = "shutdown executor";
executor.shutdownNow();
} catch(e) {
console.log("HttpServer::threadServer::error::" + attempt + "::" + e + "::" + e.stack);
try {
serverSocket.close();
} catch (ee) {
console.log("HttpServer::serverSocketClose::" + ee + "::" + ee.stack);
}
stopped = true;
}
}
*/
this.run = () => {
var clientSocket;
try {
serverSocket = new java.net.ServerSocket(inetSocketAddr.getPort(), backlog);
console.log("new run started");
while(1) {
clientSocket = serverSocket.accept();
executor.execute(
new ClientProcessor(
clientSocket
)
);
}
}
catch(e) {
executor.shutdownNow();
//stopped = true;
console.log("threadServer::stopped::" + e + "::" + e.stack);
try {
serverSocket.close();
} catch(e) {}
serverSocket = null;
}
}
this.terminate = () => {
if (serverSocket) {
serverSocket.close();
}
}
}
var notFoundHandler = (exchange) => {
var response = exchange.getResponseMessage();
response.setResponseCode(404);
response.getHeaders().set("Content-Type", "text/html");
response.getHeaders().set("Charset", "UTF-8");
response.setBody(
"