-- Leo's gemini proxy

-- Connecting to git.skyjake.fi:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini; charset=utf-8

GmCapsule


Extensible Gemini/Titan Server

🔖 Tags

🗎 File Tree

⌥ Branches [main]

Clone URL


Latest Commits


2024-04-13 Bumped version to v0.7 — 🔖 v0.7.0

2024-04-13 CGI: Use path wildcards with `bin_root` executables; look for "index.gmi" files

2024-04-13 Skip the TLS SNI check when request hostname has a literal IP address

2024-04-13 Respond with status 53 if an unknown hostname is requested

2024-04-13 Bumped version to 0.6.2; updated Project Gemini URL

2023-11-16 Fixing the Read the Docs build

2023-11-16 Read the Docs needs to import the module

2023-11-16 Fixing Read the Docs

More...

GmCapsule is an extensible server for Gemini and Titan.


See the User manual for configuration and usage instructions.


Gemini

Titan

User manual

Installation


Install "gmcapsule" via `pip`:


pip install gmcapsule

Then run the server daemon:


gmcapsuled

Running via systemd


Create the following service file and save it as _~/.config/systemd/user/gmcapsule.service_:


[Unit]
Description=GmCapsule: extensible Gemini/Titan server
After=network.target

[Service]
Type=simple
ExecStart=<YOUR-INSTALL-PATH>/gmcapsuled
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
Environment="PYTHONUNBUFFERED=1"
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=gmcapsule

[Install]
WantedBy=default.target

Replace `<YOUR-INSTALL-PATH>` with the actual path of `gmcapsuled`. `pip` will install it in a directory on your PATH.


Then you can do the usual:


systemctl --user daemon-reload
systemctl --user enable gmcapsule
systemctl --user start gmcapsule

The log can be viewed via journalctl (or syslog):


journalctl -xe --user-unit=gmcapsule

Change log


v0.7


CGI: Fixed contents of `PATH_INFO`: it is now URL-decoded and the script path is removed so only the part following the script path is included in the environment variable (RFC 3875, section 4.1.5).

CGI: `bin_root` applies a wildcard to all found CGI executables so `PATH_INFO` can be used.

CGI: `bin_root` looks for executable "index.gmi" files in requested directories to provide the directory index.

Skip the TLS SNI check when request hostname has a literal IP address. (SNI is not supposed to be used with literal addresses.)

Respond with status 53 if an unknown hostname is requested. This helps reveal configuration errors where the correct hostnames are not specified.


v0.6


Added `stream` to the `[cgi.*]` section to enable streaming output mode where the output of the CGI child process is immediately sent to the client without any buffering. Streaming is not supported if the server is using multiple processes.

Markdown: Fixed handling of alt text in preformatted blocks (patch by Mike Cifelli).


v0.6.1:


Static: Fixed unquoting URL paths when looking up files.

Added example of printing Gemini meta line in CGI documentation.


v0.5


Added `processes` to the `[server]` section to configure how many request handler processes are started.

Extension modules can register new protocols in addition to the built-in Gemini and Titan.

SIGHUP causes the configuration file to be reloaded and workers to be restarted. The listening socket remains open, so the socket and TLS parameters cannot be changed.

API change: Extension modules get initialized separately in each worker thread. Instead of a `Capsule`, the extension module `init` method is passed a `Context`. `Capsule` is no longer available as global state.

API change: `Identity` no longer contains OpenSSL objects for the certificate and public key. Instead, they are provided as serialized in DER format.


v0.5.1:


`Identity` class is available when importing the `gmcapsule` module.


v0.5.2:


Fixed error in the "rewrite" module (Codeberg PR #1).


v0.5.3:


Enable address reuse on the server socket for unimpeded restarting (Codeberg PR #3).


v0.4


Added built-in module "rewrite" that matches regular expressions against the request path and can rewrite the path or return a custom status for redirection, "Gone" messages, or other exceptional situations.

Extension module load order is determined after locating all modules from all directories. Previously, the order was local to each directory.

Added a new configuration section `[priority]` for overriding default module priorities determined from file names. This is useful for changing the priority of the built-in modules.


v0.4.1:


Rewrite: Request query string can be included in a `status` using the `${QUERY_STRING}` variable.


v0.3


Added a shutdown event for custom background workers.

`Request.query` is None if there is no query string present. Previously, the query string was an empty string in this case. This allows making a distinction between empty and absent query strings.


v0.3.1:


CGI: Fixed handling of a missing query string.


v0.3.2:


GitView: Fixed processing of Git commit history when a message contains backslashes.


v0.2


Added `[cgi] bin_root` configuration option for automatically and dynamically mapping all executables in a directory tree to URL entry points.

Minor documentation updates.

Published on PyPi as "gmcapsule".


v0.2.1:


Fixed error handling. Exceptions are now caught and the error message is printed.


v0.2.2:


Reduced required Python version to 3.6 (f-strings).

Added systemd instructions.


v0.2.3:


Requests exceeding 1024 bytes should result in an error code and not just be ignored.

Respond with an error code to malformed UTF-8 in the request.

Verify that the port number in the request URI matches the server's port.


v0.2.4:


Fixed an error in the Markdown parser.


v0.2.5:


Fixed handling of exceptions from request handler, and print a traceback.

Fixed `importlib` error with Python 3.11.


v0.1


Initial public release.

-- Response ended

-- Page fetched on Sun May 19 09:12:09 2024