Warning: session_start(): open(/var/lib/php/sessions/sess_7qjmq25jagh4rvmf7ne3l9ioh0, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
concept Domain {
S domain;
S moduleLibID;
S proxyDestination;
bool mustBeEnabled;
toString { ret super.toString() + " " + domain; }
}
cmodule2 Eleu3 > DynEleu {
transient CRUD domainCRUD;
switchable bool verbose;
switchable bool debugNanoHTTPD;
switchable S sameSite;
start {
NanoHTTPD_debug = debugNanoHTTPD;
dbIndexingCI(Domain, 'domain);
uniqCI Domain(domain := "");
domainCRUD = new CRUD(Domain);
dm_registerAs eleuWithCRUD();
}
visualize {
var c = jtabs(
"Main", super.visualize(),
"Domains" := domainCRUD.visualize());
tablePopupMenu(domainCRUD.table(), voidfunc(JPopupMenu menu, int row) {
Domain d = domainCRUD.selected(), ret if null;
if (nempty(d.moduleLibID))
addMenuItem(menu, "Load module", rThreadEnter { dm_makeOrShow(d.moduleLibID) });
});
ret c;
}
@Override
S moduleForDomain(S domain) {
domain = dropAfterColon(domain); // drop port number
for (Domain d : domainsInMatchingOrder()) {
if (domainIsUnder_extended(domain, d.domain)) {
S mod = findMod(d);
if (verbose) print("Domain matched: " + domain + " / " + d.domain + " => " + mod);
try answer mod;
} else
if (verbose) print("Domain not matched: " + domain + " / " + d.domain);
}
ret findMod(defaultDomain());
}
Domain defaultDomain() {
ret conceptWhereCI Domain(domain := "");
}
S findMod(Domain d) {
if (d == null || empty(d.moduleLibID)) null;
ret d.mustBeEnabled
? dm_findModuleWithParams(d.moduleLibID, enabled := true)
: dm_findModule(d.moduleLibID);
}
ServeHttp_CookieHandler makeCookieHandler() {
ServeHttp_CookieHandler cookieHandler = super.makeCookieHandler();
cookieHandler.metaParams = appendPrefixIfNempty("SameSite=", sameSite);
ret cookieHandler;
}
void onWebServersStarted :: after {
forEach(webServers(), ws -> {
ws.collectHeaderLines = true;
// session is an instance of NanoHTTPD.IHTTPSession
ws.specialHandling = session -> {
S domain = mapGet(session.getHeaders(), "host");
Domain d = first(domainsInMatchingOrder(),
_d -> domainIsUnder_extended(domain, _d.domain));
if (d == null || empty(d.proxyDestination)) false;
print("Handling proxy request to " + d.proxyDestination);
HostAndPort hap = new(d.proxyDestination);
new StandaloneHttpProxy proxy;
proxy.forwardServerAndPort = req -> hap;
proxy.takeOverIncomingSocket(session.getSocket(),
session.getInputStream(),
session.getOutputStream(),
session.getMethod() + " " + session.getUri() + " " + session.getProtocolVersion(),
toUTf8(windowsLineBreaks(lines(session.getHeaderLines()))));
true;
};
});
} // onWebServersStarted
// API
Cl domainsInMatchingOrder() {
ret sortByCalculatedFieldICDesc(
filter(list(Domain), d -> !eqic(d.domain, "")),
d -> reversed(d.domain));
}
void addDomain(S domain, S moduleLibID, bool mustBeEnabled) {
uniq Domain(+domain, +moduleLibID, +mustBeEnabled);
}
}