Skip to content

dotcomboom/Pituophis

Repository files navigation

Pituophis

Documentation Status PyPI version PyPI license

Python 3 library for building Gopher clients and servers

Installation

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.

Features

  • 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

Server

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.

server_def

Quick Start

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)

Client

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.

TreeGopher

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.

Examples

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())