Python 3 library for building Gopher clients and servers
At a prompt, run pip3 install pituophis
or pip install pituophis
depending on your setup. You'll be able to import the package with import pituophis
.
- Make and send Gopher requests with the
Request
class - URL parsing with
pituophis.parse_url()
- Parse and iterate through Gopher menus with
Response.menu()
- Host Gopher servers on Python 3.7+, accepting requests asynchronously (using the same
Request
class) - Serve directories, files, and gophermaps out of the box from a publish directory ('pub/' by default) with the default handler
- Use either a custom handler altogether or a handler to use when the default handler encounters a 404 for dynamic functionality
Pituophis can act as a powerful Gopher server, with full Bucktooth-style gophermap and globbing support. Scripting is also supported through alt handlers (used in the event of a 404) or fully custom handlers (replaces Pituophis' handler entirely).
The simplest method of getting a server up and running is with the pituophis.serve()
function. See the examples and docs for more information. If you'd like to see a server built with Pituophis that can search an index, try Gophew.
A simple quick-start snippet is the following:
import pituophis
pituophis.serve('127.0.0.1', 7070, pub_dir='pub/') # typical Gopher port is 70
Here's a basic alt handler, if you're familiar with Python scripting and would like to add more interactivity to your server:
def alt(request):
if request.path == '/test':
return [pituophis.Item(text='test!')]
You can return a list of Item objects, bytes, or text. To use your alt handler, add the argument alt_handler=alt
to your serve() like this:
pituophis.serve("127.0.0.1", 7070, pub_dir='pub/', alt_handler=alt)
Pituophis can also grab files and parse menus from Gopher servers. Simple fetching is done with Request().get()
and get()
, and Request().stream()
can be used for lower-level access as a BufferedReader. The get
functions return a Response type. See the docs for more information.
An interactive demo of Pituophis' client features is provided in the form of TreeGopher, a graphical Gopher client in <250 lines of code. It uses Pituophis, PySimpleGUI, and Pyperclip. It can browse Gopher in a hierarchical structure (similarly to WSGopher32, Cyberdog, and Little Gopher Client), cache menus, read text files, download and save binary files (writing in chunks using Request().stream()
, and running on another thread), recognize URL: links and use search services.
Getting menus and files as plain text:
pituophis.get('gopher.floodgap.com').text()
pituophis.get('gopher://gopher.floodgap.com/1/').text()
pituophis.get('gopher://gopher.floodgap.com:70/0/gopher/proxy').text()
Getting a menu, parsed:
menu = pituophis.get('gopher.floodgap.com').menu()
for item in menu:
print(item.type)
print(item.text)
print(item.path)
print(item.host)
print(item.port)
Using search services:
pituophis.get('gopher://gopher.floodgap.com:70/7/v2/vs%09toast').text()
Downloading a binary:
pituophis.get('gopher://gopher.floodgap.com:70/9/gopher/clients/win/hgopher2_3.zip').binary
Requests can also be created from a URL:
import pituophis
req = pituophis.parse_url('gopher://gopher.floodgap.com/7/v2/vs%09food')
print('Getting', req.url())
rsp = req.get()
print(rsp.text())