geomyidae

A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
git clone git://r-36.net/geomyidae
Log | Files | Refs | README | LICENSE

commit 7bb98e044757e47523468791f8f4040893c34342
parent 1f99de32eae25260f0596aad2c33780a239ba999
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sat, 22 Jul 2023 18:07:39 +0200

Update CGI to the current state and restyle it.

Diffstat:
MCGI.md | 86++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 59 insertions(+), 27 deletions(-)

diff --git a/CGI.md b/CGI.md @@ -1,29 +1,37 @@ -# INTRODUCTION TO CGI +# Introduction to CGI Geomyidae has support for running scripts on each request, which will generate dynamic content. -There are two modes: standard cgi and dynamic cgi. (»CGI« as name was -just taken, because that's easier to compare to the web.) +There are three modes: standard cgi, dynamic cgi and http compatibility +mode. (»CGI« as name was just taken, because that's easier to compare +to the web.) -## PERMISSIONS +## Permissions The scripts are run using the permissions of geomyidae. It is advised to use the -g and -u options of geomyidae. -## BEFOREHAND +## Beforehand In these examples C: is what the client sends and S: what the server is sending. +## Stdout/Stdin I/O of the Scripts -## CALLING CONVENTION +All scripts called below, in TLS or Non-TLS mode, will get full access of +the socket of the connection, with the socket bound to stdin and stdout. +Geomyidae does not check for any connection duration. This allows to +create long-lasting streaming services, like radio or TV stations. + +## Calling Convention Geomyidae will call the script like this: - % $gopherroot/test.cgi $search $arguments $host $port + % $gopherroot/test.cgi $search $arguments $host $port $traversal + $selector When it is a plain request, the arguments will have these values: @@ -32,6 +40,8 @@ When it is a plain request, the arguments will have these values: -> $arguments = "" -> $host = server host -> $port = server port + -> $traversal = "" + -> $selector = "/test.cgi" If the request is for a type 7 search element, then the entered string by the user will be seen as following: @@ -41,25 +51,31 @@ the user will be seen as following: -> $arguments = "" -> $host = server host -> $port = server port + -> $traversal = "" + -> $selector = "/test.cgi\tsearchterm" When you are trying to give your script some calling arguments, the syntax is: C: /test.cgi?hello -> $search = "" - -> $arguments = »hello« + -> $arguments = "hello" -> $host = server host -> $port = server port + -> $traversal = "" + -> $selector = "/test.cgi?hello" If both ways of input are combined, the variables are set as following: C: /test.cgi?hello=world searchterm (Beware! A Tab!) - -> $search = »searchterm« - -> $arguments = »hello=world« + -> $search = "searchterm" + -> $arguments = "hello=world" -> $host = server host -> $port = server port + -> $traversal = "" + -> $selector = "/test.cgi?hello=world\tsearchterm" -## REST CALLING CONVENTION +## REST Calling Convention There is a special mode in geomyidae to imitate REST calling abilities. @@ -68,20 +84,21 @@ the base and go up the path directories, until it reaches the first not existing directory. C: /base/some/dir/that/does/not/exist?some-arguments searchterm - -> /base exists - -> /some exists - -> /dir does not exist + -> base exists + -> some exists + -> dir does not exist -> search for index.cgi or index.dcgi in /base/some - -> if not found, display directory content -> if found, call index.cgi or index.dcgi as follows: - -> $search = »searchterm« - -> $arguments = »/dir/that/does/not/exist?some-arguments« + -> $search = "searchterm" + -> $arguments = "some-arguments" -> $host = server host -> $port = server port + -> $traversal = "/dir/that/does/not/exist" + -> $selector = "/base/some/dir/that/does/not/exist?some-arguments\tsearchterm" -## STANDARD CGI +## Standard CGI -The file extension »cgi« switches to this mode, where the output of +The file extension "cgi" switches to this mode, where the output of the script is not interpreted at all by the server and the script needs to send raw content. @@ -95,9 +112,9 @@ The client will receive: S: Hello my friend. -## DYNAMIC CGI +## Dynamic CGI -For using dynamic CGI, the file needs to end in »dcgi«, which will +For using dynamic CGI, the file needs to end in "dcgi", which will switch on the interpretation of the returned lines by the server. The interpreted for- mat is the same as in the .gph files. @@ -111,16 +128,31 @@ gopher menu item. S: 1Some link /somewhere gopher.r-36.net 70 -For outputting large texts and having minor hassles with the content, -prepend »t« to every line beginning with »t« or all lines: +## HTTP Compatibility - % cat filereader.dcgi - #!/bin/sh - cat bigfile.txt | sed 's,^t,&&,' +In case someone sends some HTTP request to geomyidae and other cases, +geomyidae will do this: + + C: GET /some/dir HTTP/1.1 + -> /GET does exist and is executable + -> call GET as follows: + -> $search = "" + -> $arguments = "" + -> $host = server host + -> $port = server port + -> $traversal = "" + -> $selector = "GET /some/dir HTTP/1.1\r\n" + (full raw request by the client.) + +This allows to serve HTTP next go gopher and get TLS for free. Other +HTTP-like protocols can be used over gopher in simple scripts, like the +icecast upload protocol. -## ENVIRONMENT VARIABLES +## Environment Variables Please see the manpage geomyidae(8) for all variables and their content. +All states of the script execution environment and client request are +available. Have fun!