Gemini, Gopher, and Finger support for Net:: and URI::

Support using Liberapay Support using Flattr Support using Paypal

Gem Documentation

This project aims to add connectors to well known internet text protocols through the standard Net::* and URI::* ruby module namespaces.

Currently, only Gemini is well supported.

A Gemini client API for Ruby.

Net::Gemini provides a rich library which can be used to build Gemini user-agents.

Net::Gemini is designed to work closely with URI.

All examples bellow assume you have loaded Net::Gemini with:

require 'net/gemini'

This will also require 'uri' so you don't need to require it separately.

The Net::Gemini methods in the following section do not persist connections (the protocol does not allow it).


uri = URI('gemini://gemini.circumlunar.space/')
Net::Gemini.get(uri) # => String

GET with Dynamic Parameters

uri = URI('gemini://gus.guru/search')
uri.query = URI.encode_www_form('test')
res = Net::Gemini.get_response(uri)
puts res.body if res.body_permitted?

Response Data

res = Net::Gemini.get_response(URI('gemini://gemini.circumlunar.space/'))
# Status
puts res.status # => '20'
puts res.meta   # => 'text/gemini; charset=UTF-8; lang=en'
# Headers
puts res.header.inspect
# => { status: '20', meta: 'text/gemini; charset=UTF-8',
       mimetype: 'text/gemini', lang: 'en',
       charset: 'utf-8', format: nil }

The lang, charset and format headers will only be provided in case of text/* mimetype, and only if body for 2* status codes.

# Body
puts res.body if res.body_permitted?
puts res.body(flowed: 85)

Following Redirection

The #fetch method, contrary to the #request one will try to automatically resolves redirection, leading you to the final destination.

u = URI('gemini://exemple.com/redirect')
res = Net::Gemini.start(u.host, u.port) do |g|
puts "#{res.status} - #{res.meta}" # => '30 final/dest'
puts res.uri.to_s                  # => 'gemini://exemple.com/redirect'
u = URI('gemini://exemple.com/redirect')
res = Net::Gemini.start(u.host, u.port) do |g|
puts "#{res.status} - #{res.meta}" # => '20 - text/gemini;'
puts res.uri.to_s                  # => 'gemini://exemple.com/final/dest'