#! /bin/bash
FQDN=zcrayfish.dyndns.org
#Get the HTTP command, filename, protocol version . . .
read -r CMD OBJ PROTO BADCLIENT

filename="$(echo -ne "$OBJ" | sed -e 's/%2c/,/I' -e 's/%20/ /I')"

# get HTTP extra headers
while read -r KEY VALUE FOO
do
       test -z "$KEY"  && break;
       [ "$KEY" == $'\r' ] && break;
done

date="$(date -u +'%a, %d %b %Y %R:%S GMT')"

error400 () {
       echo -e "HTTP/1.0 400 Bad Request\r"
       echo -e "Content-Type: text/plain charset=us-ascii\r"
       echo -e "Allow: GET\r"
       echo -e "Date: $date\r"
       echo -e "Server: gopher to http gateway at $FQDN"
       echo -e "Connection: close"
       echo -e "\r\n"
       echo -e "HTTP/1.0 400 Bad Request\r"
       echo -e "Request could not be understood - bad syntax\r"
       echo -e "\r"
       echo -e "gopher to http gateway at $FQDN"
       exit
}

error404 () {
      echo -e "HTTP/1.0 404 Not Found\r"
      echo -e "Content-Type: text/plain charset=us-ascii\r"
      echo -e "Date: $date\r"
      echo -e "Server: gopher to http gateway at $FQDN"
      echo -e "Connection: close"
      echo -e "\r\n"
      echo -e "HTTP/1.0 404 Not Found\r"
      echo -e "'$OBJ' doesn't exist!\r"
      echo -e "This resource cannot be located.\r"
      echo -e "\r"
      echo -e "gopher to http gateway at $FQDN"
}

error501 () {
       echo -e "HTTP/1.0 501 Not Implemented\r"
       echo -e "Content-Type: text/plain charset=us-ascii\r"
       echo -e "Allow: GET\r"
       echo -e "Date: $date\r"
       echo -e "Server: gopher to http gateway at $FQDN"
       echo -e "Connection: close"
       echo -e "\r\n"
       echo -e "HTTP/1.0 501 Not Implemented\r"
       echo -e "This error has accoured for one of the following reasons:\r"
       echo -e " *This server only implements the GET method (e.g. your browser sent a HEAD or PUT)\r"
       echo -e " *This server, while acting as a gateway or proxy, does not support CSO queries.\r"
       echo -e "\r"
       echo -e "gopher to http gateway at $FQDN"
       exit
}

# 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

#Step4
case "$filename" in
   /favicon.ico)
       error404
       ;;
   /sitemap*|/robots.txt)
       echo -e "HTTP/1.0 200 OK\r"
       echo -e "Date: $date\r"
       echo -e "Server: gopher to http gateway at $FQDN\r"
       echo -e "Connection: close\r"
       echo -e "\r"
       /usr/bin/lynx -anonymous -dump -source gopher://$FQDN:70/0/$filename
       ;;
   /2*)
       error501
       ;;
   /7*httpsearch*)
           echo -e "HTTP/1.0 200 OK\r"
           echo -e "Content-Type: text/html; level=1\r"
           echo -e "Date: $date\r"
           echo -e "Server: gopher to http gateway at $FQDN"
           echo -e "Connection: close\r"
           echo -e "\r"
           echo -e '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 1//EN">'
       searchytwothousand="$(echo $filename | sed 's/httpsearch=//g')"
       /usr/bin/lynx -anonymous -dump -source gopher://$FQDN:70$searchytwothousand | sed 's/<A HREF="\/\/$FQDN:70/<A HREF="http:\/\/$FQDN:80/g' | sed 's/<A HREF="\/\//<A HREF="gopher:\/\//g'
       exit
       ;;

   /7*)
         echo -e "HTTP/1.0 200 OK\r"
         echo -e "Content-Type: text/html; charset=us-ascii\r"
         echo -e "Date: $date\r"
         echo -e "Server: gopher to http gateway at $FQDN"
         echo -e "\r"
         echo -e '<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">'
         echo -e '<title></title>'
         echo -e "<form action='$FQDN$filename' method='get'>"
         echo -e '<p>This is a searchable gopher index. Enter search keywords:<input type="text" name="httpsearch"></p></form>'
       ;;

   /debug*)
       echo -e "HTTP/1.0 200 OK\r"
       echo -e "Content-Type: text/plain\r"
       echo -e "\r"
       set
       ;;
###START OF DUMB / NON-INTELLIGENT GOPHER TYPES###
   /0*|/4*|/5*|/6*|/9*|/g*|/s*|/h*|/I*|/p*|/d*)
       echo -e "HTTP/1.0 200 OK\r"
       case "$filename" in
           /0*)
               echo -e "Content-Type: text/plain\r"
               ;;
           /4*)
               echo -e "Content-Type: application/mac-binhex40\r"
               ;;
           /5*)
               echo -e "Content-Type: application/octet-stream\r"
               ;;
           /6*)
               echo -e "Content-Type: text/plain\r"
               ;;
           /9*)
               echo -e "Content-Type: application/octet-stream\r"
               ;;
           /g*)
               echo -e "Content-Type: image/gif\r"
               ;;
           /s*)
               echo -e "Content-Type: application/octet-stream\r"
               ;;
           /h*)
               echo -e "Content-Type: $CONTENT_TYPE\r"
               ;;
           /I*)
               echo -e "Content-Type: image/jpeg\r"
               ;;
           /p*)
               echo -e "Content-Type: image/png\r"
               ;;
           /d*)
               echo -e "Content-Type: application/pdf\r"
               ;;
       esac
       echo -e "Date: $date\r"
       echo -e "Server: gopher to http gateway at $FQDN\r"
       echo -e "Connection: close\r"
       echo -e "\r"
       /usr/bin/lynx -anonymous -dump -source gopher://$FQDN:70$filename
       ;;
###END OF DUMB / NON-INTELLIGENT GOPHER TYPES###
   *)
           echo -e "HTTP/1.0 200 OK\r"
           echo -e "Content-Type: text/html; level=1\r"
           echo -e "Date: $date\r"
           echo -e "Server: gopher to http gateway at $FQDN"
           echo -e "Connection: close\r"
           echo -e "\r"
           echo -e '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 1//EN">'
       /usr/bin/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 | \
         sed -e 's/<a href="\/\/'$FQDN':70/<A HREF="http:\/\/'$FQDN'/g' -e 's/<a href="\/\//<A HREF="gopher:\/\//g'

       exit
       ;;
esac
exit