This commit is contained in:
Justine Tunney 2021-04-24 19:49:49 -07:00
parent 472b95fea3
commit c029e83dd8
7 changed files with 118 additions and 25 deletions

View file

@ -0,0 +1,7 @@
<!doctype html>
<meta charset="utf-8">
<title>redbean virtual host</title>
<h1>virtualbean.justine.lol</h1>
<p>This page uses redbean virtual hosting. Please refer to
<a href="//redbean.justine.lol">//redbean.justine.lol</a>
to see the primary instance.

View file

@ -98,6 +98,7 @@ o/$(MODE)/tool/net/redbean-demo.com: \
tool/net/demo/redbean-form.lua \
tool/net/demo/redbean-xhr.lua \
tool/net/demo/seekable.txt \
tool/net/demo/virtualbean.html \
tool/net/redbean.c \
net/http/parsehttprequest.c \
net/http/parseurl.c \
@ -107,9 +108,18 @@ o/$(MODE)/tool/net/redbean-demo.com: \
@$(COMPILE) -AOBJCOPY -T$@ $(OBJCOPY) -S -O binary $< $@
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/.redbean-demo
@$(COMPILE) -ADD -T$@ dd if=$@ of=o/$(MODE)/tool/net/.redbean-demo/.ape bs=64 count=11 conv=notrunc 2>/dev/null
@$(COMPILE) -AZIP -T$@ zip -qj $@ o/$(MODE)/tool/net/.redbean-demo/.ape tool/net/demo/.init.lua tool/net/demo/.reload.lua tool/net/demo/hello.lua tool/net/demo/redbean.lua tool/net/demo/404.html tool/net/favicon.ico tool/net/redbean.png tool/net/demo/redbean-form.lua tool/net/demo/redbean-xhr.lua
@$(COMPILE) -AZIP -T$@ zip -qj0 $@ tool/net/demo/seekable.txt
@$(COMPILE) -AZIP -T$@ zip -q $@ tool/net/ tool/net/demo/ tool/net/demo/index.html tool/net/demo/redbean.css tool/net/redbean.c net/http/parsehttprequest.c net/http/parseurl.c net/http/encodeurl.c test/net/http/parsehttprequest_test.c test/net/http/parseurl_test.c
@$(COMPILE) -AZIP -T$@ zip -qj $@ o/$(MODE)/tool/net/.redbean-demo/.ape tool/net/demo/.init.lua tool/net/demo/.reload.lua tool/net/demo/hello.lua
@echo "&lt;-- check out this lua server page" | $(COMPILE) -AZIP -T$@ zip -cqj $@ tool/net/demo/redbean.lua
@$(COMPILE) -AZIP -T$@ zip -qj $@ tool/net/demo/404.html tool/net/favicon.ico tool/net/redbean.png tool/net/demo/redbean-form.lua tool/net/demo/redbean-xhr.lua
@echo Uncompressed for HTTP Range requests | $(COMPILE) -AZIP -T$@ zip -cqj0 $@ tool/net/demo/seekable.txt
@$(COMPILE) -AZIP -T$@ zip -q $@ tool/net/ tool/net/demo/ tool/net/demo/index.html tool/net/demo/redbean.css tool/net/redbean.c net/http/parsehttprequest.c net/http/parseurl.c net/http/encodeurl.c test/net/http/parsehttprequest_test.c test/net/http/parseurl_test.c
@echo "<p>This is a live instance of <a href=https://justine.lol/redbean/>redbean</a>: a tiny multiplatform webserver that <a href=https://news.ycombinator.com/item?id=26271117>went viral</a> on hacker news a few months ago. since then, we've added Lua dynamic serving, which also goes as fast as 1,000,000 requests per second on a core i9 (rather than a cheap virtual machine like this). the text you're reading now is a PKZIP End Of Central Directory comment.<p>redbean aims to be production worthy across six operating systems, using a single executable file (this demo is hosted on FreeBSD 13). redbean has been enhanced to restore the APE header after startup. It automatically generates this listing page based on your ZIP contents. If you use redbean as an application server / web development environment, then you'll find other new and useful features like function call logging so you can get that sweet sweet microsecond scale latency." | $(COMPILE) -AZIP -T$@ zip -z $@
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/virtualbean.justine.lol/
@$(COMPILE) -ACP -T$@ cp tool/net/redbean.png o/$(MODE)/tool/net/virtualbean.justine.lol/redbean.png
@$(COMPILE) -ACP -T$@ cp tool/net/demo/virtualbean.html o/$(MODE)/tool/net/virtualbean.justine.lol/index.html
@(cd o/$(MODE)/tool/net && zip -q redbean-demo.com virtualbean.justine.lol/)
@(cd o/$(MODE)/tool/net && echo 'Go to <a href=http://virtualbean.justine.lol>http://virtualbean.justine.lol</a>' | zip -cq redbean-demo.com virtualbean.justine.lol/index.html)
@(cd o/$(MODE)/tool/net && zip -q redbean-demo.com virtualbean.justine.lol/redbean.png)
o/$(MODE)/tool/net/redbean-static.com: \
o/$(MODE)/tool/net/redbean-static.com.dbg \

View file

@ -1091,7 +1091,11 @@ static void GetOpts(int argc, char *argv[]) {
static void Daemonize(void) {
char ibuf[21];
int i, fd, pid;
for (i = 0; i < 128; ++i) close(i);
for (i = 3; i < 128; ++i) {
if (i != server) {
close(i);
}
}
if ((pid = fork()) > 0) exit(0);
setsid();
if ((pid = fork()) > 0) _exit(0);
@ -1105,8 +1109,8 @@ static void Daemonize(void) {
freopen("/dev/null", "r", stdin);
freopen(logpath, "a", stdout);
freopen(logpath, "a", stderr);
LOGIFNEG1(setuid(daemonuid));
LOGIFNEG1(setgid(daemongid));
LOGIFNEG1(setuid(daemonuid));
}
static void ReportWorkerExit(int pid, int ws) {
@ -1164,13 +1168,13 @@ static void AppendResourceReport(struct rusage *ru, const char *nl) {
(int)((long double)ru->ru_nvcsw / (ru->ru_nvcsw + ru->ru_nivcsw) * 100),
nl);
}
if (ru->ru_inblock || ru->ru_oublock) {
Append("performed %,ld read and %,ld write i/o operations%s",
ru->ru_inblock, ru->ru_oublock, nl);
}
if (ru->ru_msgrcv || ru->ru_msgsnd) {
Append("received %,ld message and sent %,ld%s", ru->ru_msgrcv,
ru->ru_msgsnd, nl);
Append("received %,ld message%s and sent %,ld%s", ru->ru_msgrcv,
ru->ru_msgrcv == 1 ? "" : "s", ru->ru_msgsnd, nl);
}
if (ru->ru_inblock || ru->ru_oublock) {
Append("performed %,ld read%s and %,ld write i/o operations%s",
ru->ru_inblock, ru->ru_inblock == 1 ? "" : "s", ru->ru_oublock, nl);
}
if (ru->ru_nsignals) {
Append("received %,ld signals%s", ru->ru_nsignals, nl);
@ -2035,17 +2039,25 @@ static char *ServeListing(void) {
<style>\r\n\
html { color: #111; font-family: sans-serif; }\r\n\
a { text-decoration: none; }\r\n\
a:hover { color: #00e; border-bottom: 1px solid #ccc; }\r\n\
pre a:hover { color: #00e; border-bottom: 1px solid #ccc; }\r\n\
h1 a { color: #111; }\r\n\
img { vertical-align: middle; }\r\n\
footer { color: #555; font-size: 10pt; }\r\n\
td { padding-right: 3em; }\r\n\
.eocdcomment { max-width: 800px; color: #333; font-size: 11pt; }\r\n\
</style>\r\n\
<header><h1>\r\n");
AppendLogo();
rp[0] = EscapeHtml(brand, -1, &rn[0]);
AppendData(rp[0], rn[0]);
free(rp[0]);
Append("</h1><hr></header><pre>\r\n");
Append("</h1>\r\n"
"<div class=\"eocdcomment\">%.*s</div>\r\n"
"<hr>\r\n"
"</header>\r\n"
"<pre>\r\n",
strnlen(GetZipCdirComment(cdir), GetZipCdirCommentSize(cdir)),
GetZipCdirComment(cdir));
memset(w, 0, sizeof(w));
n = GetZipCdirRecords(cdir);
for (cf = GetZipCdirOffset(cdir); n--; cf += ZIP_CFILE_HDRSIZE(zmap + cf)) {
@ -2073,7 +2085,6 @@ td { padding-right: 3em; }\r\n\
ZIP_CFILE_COMMENTSIZE(zmap + cf)),
&rn[3]);
rp[4] = EscapeHtml(rp[0], rn[0], &rn[4]);
rp[5] = EscapeHtml(rp[3], rn[3], &rn[0]);
lastmod = GetZipCfileLastModified(zmap + cf);
localtime_r(&lastmod, &tm);
strftime(tb, sizeof(tb), "%Y-%m-%d %H:%M:%S %Z", &tm);
@ -2083,14 +2094,13 @@ td { padding-right: 3em; }\r\n\
Append("<a href=\"%.*s\">%-*.*s</a> %s %0*o %4s %,*ld %'s\r\n",
rn[2], rp[2], w[0], rn[4], rp[4], tb, w[1],
GetZipCfileMode(zmap + cf), DescribeCompressionRatio(rb, lf),
w[2], GetZipLfileUncompressedSize(zmap + lf), rp[5]);
w[2], GetZipLfileUncompressedSize(zmap + lf), rp[3]);
} else {
Append("%-*.*s %s %0*o %4s %,*ld %'s\r\n", w[0], rn[4], rp[4], tb,
w[1], GetZipCfileMode(zmap + cf),
DescribeCompressionRatio(rb, lf), w[2],
GetZipLfileUncompressedSize(zmap + lf), rp[5]);
GetZipLfileUncompressedSize(zmap + lf), rp[3]);
}
free(rp[5]);
free(rp[4]);
free(rp[3]);
free(rp[2]);
@ -2100,9 +2110,13 @@ td { padding-right: 3em; }\r\n\
free(path);
}
Append("</pre><footer><hr>\r\n");
Append("<table border=\"0\"><tr><td valign=\"top\">\r\n");
Append("<a href=\"/statusz\">/statusz</a> says your redbean<br>\r\n");
AppendResourceReport(&shared->children, "<br>\r\n");
Append("<table border=\"0\"><tr>\r\n");
Append("<td valign=\"top\">\r\n");
Append("<a href=\"/statusz\">/statusz</a>\r\n");
if (shared->connectionshandled) {
Append("says your redbean<br>\r\n");
AppendResourceReport(&shared->children, "<br>\r\n");
}
Append("<td valign=\"top\">\r\n");
and = "";
x = nowl() - startserver;
@ -4507,7 +4521,6 @@ void RedBean(int argc, char *argv[], const char *prog) {
}
exit(1);
}
if (daemonize) Daemonize();
CHECK_NE(-1, listen(server, 10));
addrsize = sizeof(serveraddr);
CHECK_NE(-1, getsockname(server, &serveraddr, &addrsize));
@ -4516,6 +4529,7 @@ void RedBean(int argc, char *argv[], const char *prog) {
printf("%d\n", ntohs(serveraddr.sin_port));
fflush(stdout);
}
if (daemonize) Daemonize();
UpdateCurrentDate(nowl());
freelist.c = 8;
freelist.p = xcalloc(freelist.c, sizeof(*freelist.p));
@ -4558,8 +4572,10 @@ void RedBean(int argc, char *argv[], const char *prog) {
}
int main(int argc, char *argv[]) {
setenv("GDB", "", true);
if (!IsTiny()) showcrashreports();
if (!IsTiny()) {
setenv("GDB", "", true);
showcrashreports();
}
RedBean(argc, argv, (const char *)getauxval(AT_EXECFN));
return 0;
}