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.

As @solderpunk said, one vision could be this:

1. All connections are TLS secured

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

3. Responses are guaranteed UTF-8 encoded text

4. No further structure of response is guaranteed

5. 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.

2. 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.

3. 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.

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

5. 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.

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.

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 ​#Nimi_Mute #Web
#Gopher #Simple_Text ​#Web #Gopher #Simple_Text ​#Gopher
#Simple_Text ​#Simple_Text