A library for the development of Gemini clients
Project description
Agunua
Agunua is a Python library for the development of Gemini clients.
Installation
You need Python 3, netaddr,
PySocks and PyOpenSSL. You
can install the dependencies with pip pip3 install agunua
.
Usage
import Agunua
...
u = Agunua.GeminiUri(url)
print(u)
Parameters in the GeminiUri()
constructor (you can find their
default values at the beginning of the file Agunua/__init__.py
):
url
: the URL to loadinsecure
: accept invalid certificates (signed by unknown CA, for instance)tofu
: performs TOFU (Trust On First Use) validation. It is a string, not a boolean. If empty, we disable TOFU. Otherwise, it is the directory of TOFU data.accept_expired
: accept expired certificates (insecure = True
is not sufficient for that)get_content
: retrieve the actual resource (default is to get metadata only)parse_content
: if it is gemtext (text/gemini), parse and extract linksmaxlines
: if it is text, maximum number of lines retrieved. Set to None if you don't want a limitmaxsize
: maximum size in bytes to retrieve. Set to None if you don't want a limitbinary
: (automatic if the content is text). Retrieve as binary content, don't play with end-of-linesfollow_redirect
: automatically follow Gemini redirectionsredirect_depth
: maximum number of redirections followedignore_missing_tls_close
: ignore the lack of a proper TLS close (may lead to truncation attacks but many Gemini servers don't send it)iri
: handle IRI (URI in Unicode)force_ipv4
: use the IPv4 protocol onlyforce_ipv6
: use the IPv6 protocol onlysend_sni
: send the TLS Server Name Indicationconnect_to
: use the host name in the URI for the Gemini request but connect only to this host (name or address). Useful when the host is multihomed.clientcert
: the filename of a client certificate that will be sent to the server.clientkey
: the filename of the private key of the above certificate.use_socks
: use a SOCKS5 proxy (for instance for.onion
capsules). The value must be a tuple (socks proxy name, socks proxy port).
If the URL is invalid (wrong syntax), you won't get a GeminiUri
object. If you get one, it does not mean the resource has been
retrieved successfully. See the attribute network_success
for that,
and then the attribute status_code
(that you have to interpret
yourself, in most cases).
Attributes of GeminiUri
objects (not all of them will always be
present; for instance, if you did not ask to get content, you won't
have an attribute size
; if the status code is not 20 - OK - you
won't get a mediatype; etc):
network_success
: resource was retrieved successfullystatus_code
: if retrieved successfully, the Gemini two-digit status codeerror
: ifnetwork_success
is false, this is the reasonip_address
: IP address used for the retrieval (except is SOCKS was used)meta
: themeta
field of the Gemini protocol. It depends on the status code. Read the Gemini specification for detail.binary
: if you asked for binary access, it will be True. If you asked for text access (binary=False in the constructor) and asked to ge the content (get_content=True), it will be set to False if decoding went well and True if the decoding failed, for instance because the file did not match the announced "charset".links
: an array of the links found in the document (if you've setparse_content
)payload
: the contentsize
: the size of the payload. Since Gemini does not have a way to indicate at the beginning the payload size, this will be obtained only ifget_content
is true, and it will be limited by the parametermaxsize
mediatype
: the media type (MIME type) of the resource, such astext/gemini
orimage/jpeg
lang
: the human language of the resource, as standardized in BCP 47charset
: actually the encoding of the resource such as UTF-8 or US-ASCIItls_version
: the TLS version, for instance, "TLSv1.3"no_shutdown
: [DEPRECATED See https://framagit.org/bortzmeyer/agunua/-/issues/50] set to True if the server did not properly close the TLS session. It may mean that the content was truncated. Meaningful only withget_content=True
and if you asked for the whole file.possible_truncation_issue
: set to True if we got a TLS error which may indicate that the data were truncated.- The rest is related to certificates:
issuer
: the CA (Certificate Authority)subject
: the name in the certificate (X.509 calls it "subject")expired
: the certificate has expiredcert_not_after
: expiration datecert_not_before
: inception datecert_algo
: algorithm used by the CAcert_key_type
: algorithm of the public keykeystring
: the public keycert_key_size
: size of the public key
For an example, see sample-client.py
. (In the source code, the test suite under tests/
is also a good way to learn about how to use the library.) Agunua is used in the Manisha monitoring tool and in the Lupa crawler.
Command-line client
agunua
is a simple Gemini command-line client, a bit like curl. See
its documentation. Most parameters of the library
GeminiUri()
constructor can be set via options. Important: the
default value is not always the same with the command-line tool. For
instance, it defaults to actually retrieving the content.
Download an entire capsule
Another command-line client, geminitrack
, allows you to retrieve an entire capsule, for instance for backups. See its documentation.
Name
Agunua is a melanesian serpent god. Caduceus would have been better for a Python + Gemini project since there are two snakes on a caduceus but it was already used.
License
GPL. See LICENSE.
Recent changes
See the file CHANGES.
Authors
Stéphane Bortzmeyer stephane+framagit@bortzmeyer.org.
Reference site
https://framagit.org/bortzmeyer/agunua/ Use the Gitlab issue tracker to report bugs or wishes. But you can of course also access it with gemini at gemini://gemini.bortzmeyer.org/software/agunua/
Other Gemini clients in Python
- https://tildegit.org/solderpunk/gemini-demo-1 Very simple but working client
- https://github.com/cbrews/ignition Modelled on the
requests
library so very convenient for programmers - https://git.carcosa.net/jmcbray/gusmobile/ Good code
- https://git.sr.ht/~fkfd/picross
- https://github.com/apellis/pygemini No longer maintained
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file agunua-1.7.1.tar.gz
.
File metadata
- Download URL: agunua-1.7.1.tar.gz
- Upload date:
- Size: 31.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 colorama/0.4.4 importlib-metadata/4.6.4 keyring/23.5.0 pkginfo/1.8.2 readme-renderer/34.0 requests-toolbelt/0.9.1 requests/2.25.1 rfc3986/1.5.0 tqdm/4.57.0 urllib3/1.26.5 CPython/3.10.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 987a17acca642c38d573c4e012d6517e15de7140714a18b5e257ab728ff0ec30 |
|
MD5 | 53c0c6c8f1e5fa429fd7cbd2c76d672e |
|
BLAKE2b-256 | a3cb8ca8553b128f72cf4eb2d8adf8667d22b54ae430460a6138e4563d460508 |