!7 // for sub-bots please include function serveRedirect. please include function serve403. please include function serve404. please include function serve500. please include function serveFile. please include function serveFileWithName. please include function serveFile_maxCache. please include function serveByteArray. please include function serveByteArray_maxCache. sclass WebRequest { NanoHTTPD.IHTTPSession session; S uri; SS params; S cookie; *(NanoHTTPD.IHTTPSession *session, S *uri, SS *params) {} S clientIP() { ret unnull(getClientIPFromHeaders(session.getHeaders())); } S cookie() { ret cookie; } } cmodule Eleu3 > DynPrintLogAndEnabled { !include #1027628 // HTTP+HTTPS servers start { dm_restartOnFieldChange enabled(); if (!enabled) ret; set redirectHttpToHttps; start_webServers(serverSocketFactory_botCompanyEtc()); } O webServe(S uri, SS params) { Pair spamCheck = spamBlocker.checkRequest(uri, serveHttp_clientIP()); if (spamCheck.b) { sleepSeconds(60.0); ret print("go away"); } printVars("webServe", +uri); // Serve Let's encrypt challenges if (startsWith(uri, "/.well-known/")) ret loadTextFile(userDir("validation.txt")); // Serve CRUDDIE WebRequest req = new(NanoHTTPD.currentSession!, uri, params); req.cookie = nu ServeHttp_CookieHandler(verbose := true).handle(); S cruddie = dm_findModuleWithParams("#1028961/Cruddie", enabled := true); if (cruddie != null) { dm_call(cruddie, 'setEleu, mc()); ret dm_call(cruddie, 'html, req); } ret "hello"; } }