feat: serve gopher with dot-stuffing and a synthetic root menu
This commit is contained in:
parent
1de4674b09
commit
dc2114a4d2
8 changed files with 334 additions and 11 deletions
22
README.md
22
README.md
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[](LICENSE) [](https://ai-declaration.md)
|
||||
|
||||
Serve folders of Markdown to different domains over HTTP, [Spartan](https://portal.mozz.us/gemini/spartan.mozz.us/) and [Nex](https://nightfall.city/nex/info/specification.txt), rendered on the fly with no build step.
|
||||
Serve folders of Markdown to different domains over HTTP, [Spartan](https://portal.mozz.us/gemini/spartan.mozz.us/), [Nex](https://nightfall.city/nex/info/specification.txt) and [Gopher](https://www.rfc-editor.org/rfc/rfc1436), rendered on request with no build step.
|
||||
|
||||
A Rust re-implementation of [smolweb](https://code.randogoth.com/randogoth/smolweb), which serves one folder from one process with its output formats hardcoded and its configuration in per-file frontmatter. itsybitsy changes all three: one process serves many domains, each output format is a separate crate behind a cargo feature, and configuration lives in a TOML file per content directory.
|
||||
|
||||
## Status
|
||||
|
||||
It serves. HTTP, Spartan and Nex are working across five output formats, with virtual hosting on all three. Gemini and Gopher are the remaining protocols.
|
||||
It serves. HTTP, Spartan, Nex and Gopher are working across five output formats, with virtual hosting wherever the protocol carries a hostname. Gemini is the one protocol left.
|
||||
|
||||
| Area | State |
|
||||
| --- | --- |
|
||||
|
|
@ -20,7 +20,8 @@ It serves. HTTP, Spartan and Nex are working across five output formats, with vi
|
|||
| Fixed-width text output (Nex, later Gopher) | implemented |
|
||||
| FIGlet banners and hyphenation, behind features | implemented |
|
||||
| WML decks and card sub-documents, behind a feature | implemented |
|
||||
| Gemini and Gopher | planned |
|
||||
| Gopher, with dot-stuffing and the RFC 4266 root menu | implemented |
|
||||
| Gemini | planned |
|
||||
|
||||
## Configuration
|
||||
|
||||
|
|
@ -142,6 +143,21 @@ cargo build --release --features "figlet hyphenation"
|
|||
|
||||
A banner that will not fit the line, names a font this build lacks, or is asked for by a build without `figlet` falls back to the level's underline — a heading that cannot be decorated should not be lost. An unknown font name is logged, since that is almost always a typo. Likewise `hyphenate` has no effect without the feature, and an unknown `hyphen_lang` leaves the text unhyphenated; a ragged right edge is the plain-text convention anyway.
|
||||
|
||||
## Protocols
|
||||
|
||||
| Protocol | Routes by | Notes |
|
||||
| --- | --- | --- |
|
||||
| HTTP | `Host` header | `GET` and `HEAD`, negotiated by `Accept` |
|
||||
| Spartan | the host field of its request line | One format per listener |
|
||||
| Nex | nothing; its listener names one site | No status line at all |
|
||||
| Gopher | nothing; its listener names one site | Item type 0 and the root menu |
|
||||
|
||||
A protocol with no hostname in its requests cannot be routed by one, so its listener names a single site outright and configuration refuses to leave that implicit once more than one site exists. HTTP and Spartan fall back to `default_site` when a request names a host this server does not know.
|
||||
|
||||
Neither Nex nor Gopher has a redirect status, so a canonical target is resolved server-side and the real content comes back on the first request rather than a bounce.
|
||||
|
||||
Gopher serves item type 0 (text) and one menu: a prefix-less `gopher://host/` means item type 1 by RFC 4266, so an empty selector gets a one-item menu pointing at `/` rather than the root document, which would be the wrong type. Text items are dot-stuffed and terminated with a lone dot; binary items are sent raw, since dot-stuffing would corrupt them and a terminator would become part of the file. There are no generated directory listings and no type 7 search.
|
||||
|
||||
## Card sub-documents
|
||||
|
||||
WML is the one output that paginates: a WAP 1.x handset has a hard per-card byte budget and refuses a deck that exceeds it. So a long page becomes a chain of screens, and a page with dividers becomes a menu card linking to the rest.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue