Warning: session_start(): open(/var/lib/php/sessions/sess_sg0vhvv89kvhd36q0i2isu76kr, 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
// TODO: only works with NanoHTTPD for now
sclass HttpFromFileSystem {
File baseDir;
bool serveDirectoryListings;
O serve(S uri) {
LS parts = nempties(splitAtSlash(uri));
// 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)) fail("Bad path: " + uri);
File f = baseDir;
if (!isDirectory(dir)) print("Base dir not found: " + f2s(f));
for (S part : parts) {
f = newFile(f, part);
if (!fileExists(f))
fail("Path not found: " + uri);
}
if (isDirectory(f))
ret serveListing(f);
else
ret serveFile(f);
}
O serveFile(File f) {
ret main serveFile(f, contentTypeForFile(f));
}
O serveListing(File dir) {
if (!serveDirectoryListings) fail("Can't serve directory listings");
ret "Directory listing"
+ ul_htmlEncode(listFileNames(dir));
}
swappable S contentTypeForFile(File f) {
ret or2(extensionToMimeType(f), binaryMimeType());
}
swappable bool validFileName(S name) { ret isValidFileName(name); }
}