[ANN] Specification update
Solderpunk
solderpunk at posteo.net
Sun Nov 7 15:50:09 GMT 2021
Greetings Geminauts,
I've just pushed the first changes to the official Gemini specification
in close to one year! As always the official specification can be
viewed at:
* gemini://gemini.circumlunar.space/docs/specification.gmi
* gopher://gemini.circumlunar.space:70/0/docs/specification.txt
* https://gemini.circumlunar.space/docs/specification.html
You can also `git clone git://gemini.circumlunar.space/gemini-site` to
see individual diffs for spec changes.
A quick preamble: in the gitlab.com repos set up by Sean to work on
finalising the specification, the single document form of the current
official spec has been replaced by two separate documents, one for the
transport protocol and one for the markup language. I think this is a
good idea and I intend to adopt it for the official spec. But I also
want to work carefully through the proposed changes which made it into
that repo and approve or reject them individually. To facilitate this
workflow it's easier for me, for now, to "backport" changes to the old
format. Once I've decided I'm happy with things I'll backport as much
of the new writing as proves to be applicable when translating the
format. This is all a bit ugly, but it's not the end of the world.
There's real value in having the diffs that actually change spec
behaviour as opposed to wording/presentation be short and sweet.
Okay, I have made three changes:
1. Gemini URIs with empty paths (e.g. `gemini://example.com`) and those
with paths of `/` (e.g. `gemini://example.com/`) are now equivalent by
definition, and both clients and servers SHOULD normalise empty paths to
`/` before sending/processing requests (along with applying other
standard URI normalisations).
2. The use of the TLS `close_notify` mechanism is now mandatory (see
sections 1.1 and 4).
3. The spec is now more explicit about clients not sending anything
after a request and servers ignoring anything else they receive after a
request.
You can find a little further explanation of my reasoning behind these
changes in the corresponding Gitlab issues (#11, #2 and #40).
There are no major changes here. `close_notify` was in fact *already*
mandatory via the TLS specs, so we are just being very explicit by
repeating that in the Gemini spec. The tightened language in change
three is just an attempt to close loopholes. Nobody should have been
doing any of the things it prohibits anyway. If you were, you should
feel bad. The biggest change is the first one. Depending on how you
read RFC 3986, prior to this change it was maybe sorta technically okay
for a server to serve different content from gemini://example.com and
gemini://example.com/. This is no longer allowed. If you have actually
been doing this you need to stop it, you strange, strange person. Both
client and server authors should also update their code to normalise
URIs (see section 6.2.3 of RFC 3986). Hopefully many will be able to
rely on libraries to do this. If you're forced to implement this by
hand, the most important normalisation in practice is also one of the
simplest: replace an empty path by a `/`. This will help cut down on
superfluous redirects.
Even if `close_notify` was not strictly required by the TLS RFCs, it
would be logically necessary in Gemini, thanks to the lack of content
length information, to disambiguate complete responses from erroneously
or malisciously truncated responses. There *are* servers out there
which do not reliably use `close_notify`. In principle clients visiting
capsules at those servers should interpret this as something having gone
wrong and e.g. notify the user or perhaps automatically retry the
request. In practice client authors may wish to "be gentle" for a
little longer and give server authors time to catch on to this issue
before making it difficult/ugly to visit their capsules. Those who
provide "torture test" services for server authors should certainly flag
lack of `close_notify` as a problem.
Cheers,
Solderpunk
More information about the Gemini
mailing list