2019-06-19 A Simple Text Client

OK, this one goes together with the Simple Text Server I wrote about yesterday. The server is basically a weird Gopher/Finger server that can only serve text files. It doesn’t know anything about Gopher menus, of FTP commands, or directory listings. Everything else would be part of the client.

=> Simple Text Server

As @solderpunk said, one vision could be this:

=> @solderpunk

  1. All connections are TLS secured

  1. Requests are a UTF-8 encoded selector and a CLRF, nothing more

  1. Responses are guaranteed UTF-8 encoded text

  1. No further structure of response is guaranteed

  1. Clients should be able to extract any URLs from anywhere in the text and construct a menu, with interface of their own choosing.

In my particular case, Nimi Mute (the server I wrote) sadly doesn’t qualify:

  1. TLS is optional. You can run it without encryption.

  1. Requests are not decoded. It’s raw bytes. These encode filenames and since I use UTF-8 encoded filenames, this might work. But it might also not work: remember that Unicode can be in NFC or in NFD, both equivalent encodings but using a different sequence of bytes. See Unicode equivalence for more.

  1. Responses are not guaranteed to be UTF-8 encoded. As I prefer using UTF-8, this usually works. However, yesterday I showed how you can download binary files from the text server. That alone shows you that arbitrary bytes are allowed.

  1. No further structure of response is guaranteed. This I support, haha!

  1. Clients should be able to extract any URLs from anywhere in the text and construct a menu, with interface of their own choosing. And that brings us to the topic of today: I need a proof-of-concept client.

=> Unicode equivalence

My main problem is that I want a better Gopher client for my iOS phone. Since I have no idea how to write a native application, and since I don’t want to develop on my Mac, that leaves me with a web app. I can’t write a client-side web app because they all run in the browser sandbox which doesn’t have access to TCP sockets. All you have is web sockets. They are not compatible. For a while I tried to use Fennel, compile it to Lua, and use Fengari to host it. Then I thought about WebPerl, which is a Perl compiled with Emscripten to WebAssembly. But it’s all the same: no escaping from the sandbox.

=> Fennel | Lua | Fengari | WebPerl

So I decided to write a server-side client: Soweli Lukin. The browser access the web app I wrote, passes it a Gopher URL, which it fetches from my Gopher server, and renders as Markdown, with some additional translation. It works!

You can follow Gopher links to external sources: if they are links to text files, these URLs are accessed via Soweli Lukin. Everything else is up to your browser.

Ideally, this would be a native app on my phone, or a command line program on my laptop. But as it is, this was the simplest proof of concept I could think of.

​#Soweli Lukin ​#Nimi Mute ​#Web ​#Gopher ​#Simple Text

Proxy Information
Original URL
gemini://alexschroeder.ch/2019-06-19_A_Simple_Text_Client
Status Code
Success (20)
Meta
text/gemini
Capsule Response Time
164.365419 milliseconds
Gemini-to-HTML Time
1.336763 milliseconds

This content has been proxied by September (3851b).