Warning: session_start(): open(/var/lib/php/sessions/sess_liq68arq0jqq5m6ggrodkk23bm, 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
ifdef NoNanoHTTPD
!include once #1028763
endifdef
sclass HttpFromFileSystem {
File baseDir;
bool serveDirectoryListings; // default to false
bool serveIndexHTML = true;
bool maxCache; // treat files as immutable
bool debug;
S baseLink = "";
*() {}
*(File *baseDir) {}
*(File *baseDir, bool *serveDirectoryListings) {}
O serve(S uri) {
uri = urldecode(uri);
LS parts = nempties(splitAtSlash(uri));
if (baseDir == null) ret serve404("No base directory set");
// process . and ..
for i over parts:
if (eq(parts.get(i), ".")) parts.remove(i);
else if (eq(parts.get(i), ".."))
if (i == 0) fail(".. leading nowhere: " + uri);
else {
parts.remove(i);
parts.remove(--i);
}
if (!all validFileName(parts)) {
print("Parts: " + quoteAll(parts));
fail("Bad path: " + uri);
}
File f = baseDir;
if (!isDirectory(baseDir)) print("Base dir not found: " + f2s(f));
for (S part : parts) {
f = newFile(f, part);
if (!fileExists(f))
ret serve404("Path not found: " + uri);
}
print("Trying to serve: " + f2s(f));
if (isDirectory(f))
ret serveListing(uri, f);
else
ret serveFile(f);
}
swappable O addHeaders(O response) {
if (maxCache)
ret subBot_maxCacheHeaders(response);
ret response;
}
swappable O serveFile(File f) {
ret addHeaders(main serveFile(f, contentTypeForFile(f)));
}
O serveListing(S uri, File dir) {
// take care of directory listing without trailing slash in URI
S local = addSlashIfNempty(afterLast("/" + uri, '/'));
if (serveIndexHTML) {
File index = newFile(dir, "index.html");
if (fileExists(index)) {
if (nempty(local))
ret serveRedirect(baseLink + local);
ret serveFile(index);
}
}
if (!serveDirectoryListings) fail("Can't serve directory listings");
ret "Directory listing of " + f2s(dir)
+ ul(map(listFileNames(dir), name -> {
bool isDir = isDirectory(newFile(dir, name));
if (isDir) name += "/";
ret ahref(baseLink + local + name, htmlEncode2(name))
+ (!debug ? "" : htmlEncode2(appendBracketed(renderVars(+baseLink, +uri, +local))));
}));
}
swappable S contentTypeForFile(File f) {
ret or2(extensionToMimeType(fileExtension(f)), binaryMimeType());
}
swappable bool validFileName(S name) { ret isValidFileName(name); }
}