Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/vole.git

Write over SSH with a registered key:

git clone ssh://git@rodent.software:2222/vole.git

A free and open-source forge that lives in your Git repo.

Compress hosted site responses too

a76b2f38cb6692f7fe88c83e4552205d398f30df · Keenan Nemetz · 12d ago · parent 306f36fc

Compress hosted site responses too

The gzip middleware covered the forge UI and nothing else: server.Handler
dispatches a site host to server/pages before the forge middleware runs, so
every hosted site was serving raw HTML, CSS and JavaScript. A site is a static
file server, which is the best case gzip has.

The compressor moves from server/web to internal/compress so both surfaces share
one implementation of the negotiation and header rules, with two entry points:
New for the forge, which needs the writer inside its own status recorder and
panic handling, and Handler for the site dispatcher.

Site responses keep their ETag and Last-Modified, so revalidation is still a 304
off the blob sha; Vary: Accept-Encoding names the representation; a 304 and a
301 carry no body to compress; and a client that does not ask for gzip still
gets the exact bytes and the exact Content-Length.

Measured on the site path, an HTML page with repeated markup goes from 1.5 KB to
83 bytes.

docs/operations.md +6−6

@@ -181,12 +181,12 @@ the linked sections explain each in full.
181 181 request arrives over TLS, or `public_url` is `https://`, Vole sends HSTS on
182 182 every response, not only on the pages that use passkeys. See
183 183 [Configuration](configuration.md).
184 - **Compression is already here.** Pages, the stylesheet, scripts and source
185 blobs are gzipped when the client asks for it, so a proxy in front should not
186 compress them again: double compression costs CPU and hides the `ETag`
187 revalidation that keeps the 545 KB Prism bundle to one download per browser.
188 Archives, LFS objects, Git responses and ranged downloads are passed through
189 untouched.
184 - **Compression is already here.** Forge pages, hosted sites, the stylesheet,
185 scripts and source blobs are gzipped when the client asks for it, so a proxy in
186 front should not compress them again: double compression costs CPU and hides
187 the `ETag` revalidation that keeps the 545 KB Prism bundle to one download per
188 browser. Archives, LFS objects, Git responses and ranged downloads are passed
189 through untouched.
190 190 - **SSH firewalled.** The SSH listener is the only write transport and the only
191 191 place an account is authenticated. Expose it to the people who push, not to the
192 192 internet at large, and leave it on a port other than 22 unless you also run