Skip to content

Wasat ChangeLog

v1.9.1

Released: 2026-09-05

  • Fixed Titan upload handling in Client.upload to concurrently read the server's response while streaming payload data. (#65)
  • Added timeout handling to response line reading during requests to ensure unresponsive servers cleanly raise ConnectionError rather than stalling. (#65)
  • Added timeout enforcement when closing connections to prevent indefinite hangs on wait_closed() when servers reject uploads without completing a TLS shutdown handshake. (#66)

v1.9.0

Released: 2026-09-05

  • Added support for the proposed Titan edit extension (titan://...;edit). (#63)
  • Added is_edit property and with_edit method to TitanURI, and updated TitanURI.replace to accept edit: bool. (#63)
  • Enforced parameter mutual exclusivity between edit and size on TitanURI. (#63)
  • Added edit: bool = False parameter to GeminiURI.to_titan. (#63)
  • Added Client.edit method to fetch raw editable content and acquire edit locks. (#63)
  • Updated the CLI with -e / --edit option to fetch raw content for editing, and resolved an issue where requesting a titan:// edit URI directly prompted for upload data instead of retrieving content. (#63)

v1.8.1

Released: 2026-09-04

  • Fixed TitanURI path parameter parsing to strictly apply parameters to the terminal path segment, preventing truncation of directory paths that contain semicolons. (#61)
  • Fixed TitanURI parsing to support semicolon parameters immediately following the authority without an explicit path slash. (#61)
  • Updated Client.upload and Titan redirect handling to ignore existing parameters on target and redirect URIs in compliance with the Titan specification. (#61)
  • Fixed Client.delete to avoid appending a default MIME type parameter on zero-byte payload requests. (#61)
  • Updated Client.request to raise RedirectError when following a redirect from a Gemini request to a Titan upload URI with size > 0. (#61)
  • Updated the CLI to prompt for interactive input or read from standard input when a Titan URI is requested without --upload, --data, or --delete. (#61)

v1.8.0

Released: 2026-09-03

  • Added Titan protocol support (titan://), including TitanURI representation, URI conversions (to_titan, to_gemini), and parameter parsing (size, mime, token). (#59)
  • Added Titan upload (Client.upload) and deletion (Client.delete) methods to Client. (#59)
  • Updated the CLI with --upload, --data, --delete, --mime, and --token options. (#59)

v1.7.0

Released: 2026-08-30

  • Added forget asynchronous method to the TrustStore protocol and FileTrustStore implementation to remove stored certificate fingerprints for a given host and port. (#57)

v1.6.0

Released: 2026-08-27

  • Added client_cert and client_key_path properties to Response to allow inspecting the client TLS certificate and key used for the request. client_cert lazily loads and caches the ClientCertificate instance. (#55)
  • Updated the CLI (wasat) --show-cert option to display client certificate details alongside server certificate information when a client certificate was used. (#55)

v1.5.0

Released: 2026-08-24

  • Added ClientCertificate.from_pem constructor to instantiate client certificates from in-memory PEM text or bytes, supporting combined bundles, separate certificate and private key inputs, or certificate-only data. (#52)
  • Updated ClientCertificate.from_file to automatically detect and extract private keys from single combined .pem files when key_path is omitted. (#52)
  • Added ClientCertificate.to_combined_pem method to serialise certificate and private key pairs into a single PEM byte sequence. (#52)
  • Added ClientCertificate.export method to export certificates and private keys to disk with restricted permissions (0600) on private keys. (#52)
  • Added import_certificate method to ClientCertificateStore protocol and FileClientCertificateStore implementation to import certificates from file paths, raw PEM bytes or strings, or ClientCertificate instances, with optional scope associations and safe file permissions. (#52)
  • Added export_certificate method to ClientCertificateStore protocol and FileClientCertificateStore implementation to look up certificates by fingerprint, common name, file stem, or scope and export them as combined bundles or separate files. (#52)
  • Enhanced FileClientCertificateStore.get_certificate to support lookup by certificate subject Common Name and file stem. (#52)
  • Fixed an issue where unscoped transient certificates were omitted from list_certificates in FileClientCertificateStore and could not be retrieved or managed via get_certificate, associate_scope, or delete_certificate. (#51)

v1.4.0

Released: 2026-08-23

  • Added ClientCertificate class representing client TLS certificates and private keys with full access to parsed subject attributes (Common Name, email, user ID, organisation, country), issuer, validity timestamps, expiration and self-signed checks, public key information, SHA-256 fingerprint, and associated scopes. Exported ClientCertificate as a public type at the top level. (#48)
  • Added normalize_scope helper function to normalise Gemini URIs and scope strings into canonical host:port/path format, and exported it at the top level. (#48)
  • Added list_certificates method to the ClientCertificateStore protocol and FileClientCertificateStore implementation to enumerate all stored and transient client certificates along with their associated scopes. (#48)
  • Added get_certificate method to ClientCertificateStore protocol and FileClientCertificateStore implementation to retrieve client certificates by URI, scope, SHA-256 fingerprint, or file path/name. (#48)
  • Added create_certificate method to ClientCertificateStore protocol and FileClientCertificateStore implementation to allow generating standalone identities or associating certificates with multiple scopes. (#48)
  • Added associate_scope and disassociate_scope methods to ClientCertificateStore protocol and FileClientCertificateStore implementation to allow dynamically managing scope bindings for existing certificates without duplicating certificate files on disk. (#48)
  • Added delete_certificate and delete_exact_scope methods to ClientCertificateStore protocol and FileClientCertificateStore implementation for deleting certificates and unbinding specific scopes safely. (#48)

v1.3.1

Released: 2026-07-30

  • Added ServerCertificate class and Response.server_cert property to provide high-level access to parsed server TLS certificate attributes (subject/issuer CNs, validity dates, SANs, serial number, fingerprint, and status checks). Exported ServerCertificate as a public type at the top level. (#45)
  • Updated the CLI (wasat) to add a --show-cert flag for displaying detailed server TLS certificate information. (#45)

v1.3.0

Released: 2026-07-30

  • Refined hybrid certificate verification mode to only fall back to TOFU when CA validation fails due to an untrusted root or self-signed certificate. Certificate failures caused by expiration, hostname mismatch, or revocation now immediately raise SecurityError. (#41)
  • Added VerifyMode as a type and exported it at the top level. (#41)
  • Added server_cert_der, server_cert_fingerprint, and verification_method properties to Response to expose server TLS certificate details and the verification method used. (#43)
  • Added VerificationMethod type alias and exported it at the top level. (#43)
  • Updated the CLI (wasat) to display Verification Method and Certificate Fingerprint when running in verbose (-v / --verbose) mode. (#43)

v1.2.0

Released: 2026-07-30

  • Added --verify-mode to the CLI of the library so the certificate verification mode can be tested. (#39)
  • Added hybrid certificate verification mode to Client to combine system CA validation with TOFU fallback. (#39)

v1.0.1

Released: 2026-07-21

  • Fixed unhandled ssl.SSLEOFError, ssl.SSLError, and OSError exceptions during request dispatch and response header reading by mapping them to ConnectionError. (#36)

v1.0.0

Released: 2026-07-21

  • Promoted to "stable". (#34)

v0.8.0

Released: 2026-07-18

  • Added GeminiURI.without_query. (#32)
  • Added GeminiURI.parent (#32)
  • Added GeminiURI.root (#32)

v0.7.0

Released: 2026-07-16

  • Added GeminiURI.MAXIMUM_LENGTH. (#29)
  • Added len support to GeminiURI (reports the byte length of the URI). (#29)
  • Added GeminiURI.bytes_left. (#29)
  • Added GeminiURI.too_long. (#29)

v0.6.1

Released: 2026-07-14

  • Fixed GeminiURI.with_default_scheme treating example.com in example.com:1966 as a scheme. (#27)

v0.6.0

Released: 2026-07-14

  • Relaxed the type of the parameters for GeminiURI.__init__. (#24)
  • Added GeminiURI.with_default_scheme (#25)

v0.5.0

Released: 2026-07-13

  • Added get_hosts asynchronous method to the TrustStore protocol and FileTrustStore implementation to retrieve all stored host and port combinations from the trust store. (#22)
  • Added trust_store public property to the Client class to expose the underlying trust store. (#22)

v0.4.0

Released: 2026-07-12

  • Added a new replace method to GeminiURI to allow creating a copy of a URI with specified components replaced, including removing optional components like path or query by setting them to None. (#19)
  • Added component-specific builder methods with_host, with_port, and with_path to GeminiURI. (#19)
  • Updated with_query on GeminiURI to allow setting, replacing, or clearing (by passing None) the query parameter. (#19)
  • Updated GeminiURI constructor's internal error handling to catch ValueError and other parsing anomalies (e.g. from negative/out-of-range ports) raised by urlparse, converting them into URIError. (#19)

v0.3.2

Released: 2026-07-11

  • Updated redirect certificate handling to automatically register/re-bind an inherited client certificate to the final landing URI's scope upon successful completion (status code 2x or 3x) of a redirect chain. This allows future direct requests to the target URI to automatically reuse the certificate without going through the initial redirect flow again. (#17)

v0.3.1

Released: 2026-07-11

  • Fixed client certificate handling during redirects on the same host and port. If a client certificate was successfully used for a request in a redirect chain, the client automatically retrieves and reuses it for any subsequent redirected requests targeting the same host and port, preventing certificate information loss on sibling paths. (#14)
  • Added register_credentials to the ClientCertificateStore protocol and FileClientCertificateStore implementation to allow programmatically registering/associating existing client certificate files with a new URI scope. (#14)
  • Updated the client connection logic to skip generating a new certificate if the on_client_certificate_required callback has already registered exact credentials for the URI, allowing manual registration in the callback. (#14)

v0.3.0

Released: 2026-07-11

  • Added client_cert_path and client_cert_used properties to Response to expose the path to the client certificate and a boolean flag indicating if one was used for the connection. (#11)

v0.2.1

Released: 2026-07-10

  • Fixed client certificate path prefix matching in get_candidate_scopes to support both trailing and non-trailing slash parent directory paths, ensuring certificates registered for paths like /foo/bar (no trailing slash) are correctly matched and offered for subpaths (e.g. /foo/bar/baz). (#9)
  • Added has_exact_credentials to the ClientCertificateStore protocol and FileClientCertificateStore implementation. (#9)
  • Updated the client connection logic to use has_exact_credentials when checking whether a client certificate requirement is new/fresh, ensuring the client correctly prompts the user for a new certificate if a parent certificate is rejected by the server, while avoiding infinite loops. (#9)

v0.2.0

Released: 2026-07-10

  • Allowed passing None to valid_days in generate_self_signed_cert and create_credentials to generate client certificates that expire on 9999-12-31. (#7)

v0.1.0

Released: 2026-06-24

  • Added support for generating and storing client certificates. (#3)
  • Added support for handling Gemini Protocol input requests (status codes 10 and 11) in the CLI. (#4)
  • Added uri property to Response to expose the target URI of the request. (#5)
  • Added history property to Response to expose any redirection history. (#5)
  • Added requested_uri property to Response to expose the originally-requested URI in any response. (#5)
  • Updated the CLI to show the originally-requested URI and the redirection history, in verbose mode, if there was a redirection. (#5)

v0.0.1

Released: 2026-06-17

  • Initial version of the library.