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; // default to false
*() {}
*(File *baseDir) {}
*(File *baseDir, bool *serveDirectoryListings) {}
O serve(S uri) {
uri = urldecode(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)) {
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))
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 of " + f2s(dir)
+ ul_htmlEncode(listFileNames(dir));
}
swappable S contentTypeForFile(File f) {
ret or2(extensionToMimeType(fileExtension(f)), binaryMimeType());
}
swappable bool validFileName(S name) { ret isValidFileName(name); }
}