#! /bin/sh #Set your hostname after this variable fqdn=zcrayfish.dyndns.org cr=$(printf '\r') crlf=$(printf '\r\n') null=$(printf '') trap set SIGUSR1 error400 () { printf "%s\15\12" "HTTP/1.0 400 Bad Request" \ "Content-Type: text/plain charset=us-ascii" \ "Allow: GET" \ "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ "Connection: close" \ "" \ "HTTP/1.0 400 Bad Request" \ "Request could not be understood - bad syntax" \ "" \ "gopher to http gateway at $fqdn" exit } error404 () { printf "%s\15\12" "HTTP/1.0 404 Not Found" \ "Content-Type: text/plain charset=us-ascii" \ "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ "Connection: close" \ "" \ "HTTP/1.0 404 Not Found" \ "'$obj' doesn't exist!" \ "This resource cannot be located." \ "" \ "gopher to http gateway at $fqdn" } error501 () { printf "%s\15\12" "HTTP/1.0 501 Not Implemented" \ "Content-Type: text/plain charset=us-ascii" \ "Allow: GET" \ "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ "Connection: close" \ "" \ "HTTP/1.0 501 Not Implemented" \ "This error has accoured for one of the following reasons:" \ " *This server only implements the GET method (e.g. your browser sent a HEAD or PUT)" \ " *This server, while acting as a gateway or proxy, does not support CSO queries." \ "" \ "gopher to http gateway at $fqdn" exit } #Get the HTTP command, filename, protocol version . . . while read -r cmd obj proto badclient do # We put the date in the loop in case the client waits before sending another request date="$(date -u +'%a, %d %b %Y %H:%M:%S GMT')" case "$cmd" in GET) # See if request is a GET, if not, throw it away test "$cmd" != 'GET' && error501 # Likewise ignore invalid gets too. test ! -z "$badclient" && error400 && exit # If it all looks good, find out what they want filename="$(printf "%s" "$obj" | sed -e 's/%2c/,/' -e 's/%20/ /')" #Step4 case "$filename" in /favicon.ico) error404 ;; /sitemap*|/robots.txt) printf "%s\15\12" "HTTP/1.0 200 OK" \ "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ "Connection: close" \ "" lynx -anonymous -source "gopher://$fqdn:70/0/$filename" ;; /2*) error501 ;; /7*httpsearch*) printf "%s\15\12" "HTTP/1.0 200 OK" \ "Content-Type: text/html; level=1" \ "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ "Connection: close" \ "" \ '' searchytwothousand="$(printf "%s" "$filename" | sed 's/httpsearch=//g')" lynx -anonymous -dump -source "gopher://$fqdn:70$searchytwothousand" | sed 's/' \ '' \ "
" \ '

This is a searchable gopher index. Enter search keywords:

' ;; /debug*) printf "%s\15\12" "HTTP/1.0 200 OK" \ "Content-Type: text/plain" \ "" set ;; ###START OF DUMB / NON-INTELLIGENT GOPHER TYPES### /[04569gshIpd]*) printf "%s\15\12" "HTTP/1.0 200 OK" case "$filename" in /0*) printf "%s\15\12" "Content-Type: text/plain" ;; /4*) printf "%s\15\12" "Content-Type: application/mac-binhex40" ;; /5*) printf "%s\15\12" "Content-Type: application/octet-stream" ;; /6*) printf "%s\15\12" "Content-Type: text/plain" ;; /9*) printf "%s\15\12" "Content-Type: application/octet-stream" ;; /g*) printf "%s\15\12" "Content-Type: image/gif" ;; /s*) printf "%s\15\12" "Content-Type: application/octet-stream" ;; /h*) printf "%s\15\12" "Content-Type: text/html" ;; /I*) printf "%s\15\12" "Content-Type: image/jpeg" ;; /p*) printf "%s\15\12" "Content-Type: image/png" ;; /d*) printf "%s\15\12" "Content-Type: application/pdf" ;; esac printf "%s\15\12" "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ "Connection: close" \ "" lynx -anonymous -dump -source "gopher://$fqdn:70$filename" ;; ###END OF DUMB / NON-INTELLIGENT GOPHER TYPES### *) printf "%s\15\12" 'HTTP/1.0 200 OK' \ 'Content-Type: text/html; level=1' \ "Date: $date" \ "Server: gopher to http gateway at $fqdn" \ 'Connection: close' \ '' \ '' lynx -anonymous -dump -source "gopher://$fqdn:70$filename" | \ tidy -in -w 0 -cn --doctype omit --show-errors 0 --show-warnings 0 --tidy-mark 0 --quiet 1 --uppercase-tags 1 --uppercase-attributes 1| \ sed -e 's/