Every path, without JavaScript
The path above is the one the page opens on. Every other path is listed here as the steps it takes and what each step asks the kernel for. With scripts on, the same data draws the page: 61 functions grouped into 18 steps, 32 paths, and 29 system calls the server issues.
A file is served 10 steps
GET / (location = /, try-files /index.html, 10,800 bytes) — A file from disk, small enough to go out in one write.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A page comes from another program 11 steps
GET /robots.txt (no location matches, so the catch-all applies) — A path no rule claims, forwarded to the program behind the server.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Reach the other program — close, connect, setsockopt, socket
Forward the request — recv, send
Bring the answer back — close, recv
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A plain-HTTP visitor is sent to HTTPS 8 steps
GET http://thehusky.net/scrapers — A plain-HTTP visitor sent to the secure address.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A second request on the same connection 8 steps
the same client sends another request over the same TLS connection — A second request on a connection that is already open.
Wait for work — epoll_wait
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A file too big for one write 11 steps
GET /l2-listener/data/source-index.json (a body over 16000 bytes) — A file too large for one buffer, streamed from disk.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Copy the file into the socket — poll, pread, sendfile
Write the log line — write
Keep it or close it — close, epoll_ctl
The same file, compressed 11 steps
GET / with Accept-Encoding: gzip (corpus entry home-gzip) — The same file, compressed because the browser asked.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Compress it first — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A large file handed to a helper 13 steps
GET /l2-listener/og.png (a body at or above OFFLOAD_FILE_MIN) — A large file handed to a helper before a byte is written.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Hand the connection to a helper — fork
Open the file (again) — fstat, open, pread
Put the reply on the wire — send
Copy the file into the socket — poll, pread, sendfile
Write the log line — write
Keep it or close it — close, epoll_ctl
The browser already has it 10 steps
GET / with If-None-Match matching the file's tag — The browser already has it, so only the validators go back.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
Only part of the file is wanted 11 steps
GET /books/ with Range: bytes=0-1023 — Only part of the file is wanted.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Copy the file into the socket — poll, pread, sendfile
Write the log line — write
Keep it or close it — close, epoll_ctl
A range that cannot be satisfied 10 steps
GET / with Range: bytes=99999999- — A range that cannot be satisfied.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A folder and its index file 10 steps
GET /books/ (try-files: static, directory, return 404) — A folder asked for with its slash: its index file is served.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A redirect the configuration declares 9 steps
GET /books — A redirect the route table declares.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A folder asked for without its slash 9 steps
GET /l2-listener/css (a directory under a try-files location) — A folder asked for without its slash.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A second site name 10 steps
GET https://louie.thehusky.net/.well-known/atproto-did — A second site name, with its own single rule.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
Nothing the rules list is there 10 steps
GET /books/nope — Nothing the rules list is there.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A rule that refuses a path 9 steps
GET /foo/.env — A rule that refuses any path containing a name.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
An exact rule wins 11 steps
GET /.env — An exact rule wins over the refusing one.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Reach the other program — close, connect, setsockopt, socket
Forward the request — recv, send
Bring the answer back — close, recv
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A certificate check, file present 9 steps
GET http://thehusky.net/.well-known/acme-challenge/<token> — A certificate check, with the file present.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A certificate check, file missing 9 steps
GET http://thehusky.net/.well-known/acme-challenge/x — A certificate check, with the file missing.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
An upload passed straight through 11 steps
POST /wirelab/compute with a whole leg of records — A large upload streamed straight through to the other program.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Reach the other program — close, connect, setsockopt, socket
Forward the request — recv, send
Bring the answer back — close, recv
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A proxied answer, compressed 11 steps
GET /kennel/ with Accept-Encoding: gzip (application/json, at least 1024 bytes) — A proxied answer, compressed on the way back.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Reach the other program — close, connect, setsockopt, socket
Forward the request — recv, send
Bring the answer back — close, recv
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
The other program speaks HTTPS 11 steps
POST /atlust/api/request (proxy_pass https://aozoratech.net/atnet/atlust/api) — The other program speaks HTTPS.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Reach the other program — close, connect, setsockopt, socket
Forward the request — recv, send
Bring the answer back — close, recv
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
The other program is down 10 steps
GET /spot-check/ while its listener refuses — The other program is not answering.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Reach the other program — close, connect, setsockopt, socket
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A request the server cannot read 8 steps
an unknown method, an over-long target, or a broken request line — A request the server cannot read.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
Headers that never stop 8 steps
a request head that grows past MAX_HEADER_BYTES (65536) — Headers that never stop growing.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Answer without a file — no system call
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A new secure connection 3 steps
a client opens https://thehusky.net/ — A new secure connection, before any request exists.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
A handshake that stops halfway 4 steps
a client sends half a ClientHello and stops — A handshake that stops halfway.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Keep it or close it — close, epoll_ctl
A request that stops halfway 4 steps
a plain client sends half a request head and stops — A request that stops halfway.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Read the request — clock_gettime, getrandom, recv
Keep it or close it — close, epoll_ctl
A client that stops reading 10 steps
a client asks for a body and then stops reading it — A client that stops reading the answer.
Wait for work — epoll_wait
Take the connection — accept4, epoll_ctl, setsockopt
Agree on encryption — epoll_ctl
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Copy the file into the socket — poll, pread, sendfile
Keep it or close it — close, epoll_ctl
Two requests in one packet 8 steps
two requests written in one segment — Two requests in one packet.
Wait for work — epoll_wait
Read the request — clock_gettime, getrandom, recv
Work out which rule applies — no system call
Find what to serve — stat
Open the file — fstat, open, pread
Put the reply on the wire — send
Write the log line — write
Keep it or close it — close, epoll_ctl
A client that simply leaves 3 steps
no bytes, after a request has already been served — A client that simply leaves.
Wait for work — epoll_wait
Read the request — clock_gettime, getrandom, recv
Keep it or close it — close, epoll_ctl
The server starts up 2 steps
systemctl start muxmutt — The process comes up: limits, certificate, workers, ports.
Before any request — bind, close, epoll_create1, epoll_ctl, epoll_wait, exit_group, fcntl, fork, kill, listen, nanosleep, prlimit64, rt_sigaction, setsockopt, socket, wait4
Wait for work — epoll_wait