iindex.cgi - gemini2gopher-proxy - A gemini2gopher proxy CGI script for geomyidae. Err bitreich.org 70 hgit clone git://bitreich.org/gemini2gopher-proxy git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gemini2gopher-proxy URL:git://bitreich.org/gemini2gopher-proxy git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gemini2gopher-proxy bitreich.org 70 1Log /scm/gemini2gopher-proxy/log.gph bitreich.org 70 1Files /scm/gemini2gopher-proxy/files.gph bitreich.org 70 1Refs /scm/gemini2gopher-proxy/refs.gph bitreich.org 70 1Tags /scm/gemini2gopher-proxy/tag bitreich.org 70 1README /scm/gemini2gopher-proxy/file/README.md.gph bitreich.org 70 1LICENSE /scm/gemini2gopher-proxy/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iindex.cgi (3388B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #!/bin/sh Err bitreich.org 70 i 2 # Err bitreich.org 70 i 3 # See LICENSE for copyright information. Err bitreich.org 70 i 4 # Err bitreich.org 70 i 5 # Gemini Proxy CGI script: Err bitreich.org 70 i 6 # https://gemini.circumlunar.space/docs/specification.gmi Err bitreich.org 70 i 7 # Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 search="$1" Err bitreich.org 70 i 10 arguments="$2" Err bitreich.org 70 i 11 host="$3" Err bitreich.org 70 i 12 port="$4" Err bitreich.org 70 i 13 traversal="$5" Err bitreich.org 70 i 14 selector="$6" Err bitreich.org 70 i 15 Err bitreich.org 70 i 16 proxybase="/gemini/?" Err bitreich.org 70 i 17 Err bitreich.org 70 i 18 case "${arguments}" in Err bitreich.org 70 i 19 gemini://*) Err bitreich.org 70 i 20 ;; Err bitreich.org 70 i 21 *) Err bitreich.org 70 i 22 exit 1 Err bitreich.org 70 i 23 ;; Err bitreich.org 70 i 24 esac Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 geminihost="$(printf "%s\n" "${arguments}" | cut -d'/' -f 3)" Err bitreich.org 70 i 27 [ -z "${geminihost}" ] && exit 1 Err bitreich.org 70 i 28 geminiport="$(printf "%s\n" "${geminihost}" | cut -d':' -f 2)" Err bitreich.org 70 i 29 [ "${geminiport}" = "${geminihost}" ] && geminiport="1965" Err bitreich.org 70 i 30 Err bitreich.org 70 i 31 function untabtext() { Err bitreich.org 70 i 32 printf "%s\n" "$1" | sed 's,\t, ,g' Err bitreich.org 70 i 33 } Err bitreich.org 70 i 34 Err bitreich.org 70 i 35 line0="" Err bitreich.org 70 i 36 printf "%s\r\n" "${arguments}" \ Err bitreich.org 70 i 37 | socat - "openssl:${geminihost}:${geminiport},verify=0" \ Err bitreich.org 70 i 38 | { Err bitreich.org 70 i 39 read -r line Err bitreich.org 70 i 40 line0="${line}" Err bitreich.org 70 i 41 line0meta="$(printf "%s\n" "${line0}" | cut -d' ' -f 2-)" Err bitreich.org 70 i 42 case "${line0}" in Err bitreich.org 70 i 43 1*) Err bitreich.org 70 i 44 # TODO: Add support for uri-encoded $search appending to Err bitreich.org 70 i 45 # URI. Err bitreich.org 70 i 46 printf "3search query input required\t\t\t\r\n" Err bitreich.org 70 i 47 exit 1 Err bitreich.org 70 i 48 ;; Err bitreich.org 70 i 49 2*) Err bitreich.org 70 i 50 # Only fallthrough. Err bitreich.org 70 i 51 ;; Err bitreich.org 70 i 52 3*) Err bitreich.org 70 i 53 printf "3redirect to: %s\t\t\t\r\n" "${line0meta}" Err bitreich.org 70 i 54 exit 1 Err bitreich.org 70 i 55 ;; Err bitreich.org 70 i 56 4*) Err bitreich.org 70 i 57 printf "3temporary failure\t\t\t\r\n" Err bitreich.org 70 i 58 exit 1 Err bitreich.org 70 i 59 ;; Err bitreich.org 70 i 60 5*) Err bitreich.org 70 i 61 printf "3permanent failure\t\t\t\r\n" Err bitreich.org 70 i 62 exit 1 Err bitreich.org 70 i 63 ;; Err bitreich.org 70 i 64 6*) Err bitreich.org 70 i 65 printf "3client certificate required\t\t\t\r\n" Err bitreich.org 70 i 66 exit 1 Err bitreich.org 70 i 67 ;; Err bitreich.org 70 i 68 *) Err bitreich.org 70 i 69 printf "3unknown error\t\t\t\r\n" Err bitreich.org 70 i 70 exit 1 Err bitreich.org 70 i 71 ;; Err bitreich.org 70 i 72 esac Err bitreich.org 70 i 73 Err bitreich.org 70 i 74 case "${line0meta}" in Err bitreich.org 70 i 75 text/gemini*) Err bitreich.org 70 i 76 preformat=0 Err bitreich.org 70 i 77 while read -r line; Err bitreich.org 70 i 78 do Err bitreich.org 70 i 79 case "${line}" in Err bitreich.org 70 i 80 "\`\`\`"*) Err bitreich.org 70 i 81 if [ $preformat -eq 1 ]; Err bitreich.org 70 i 82 then Err bitreich.org 70 i 83 preformat=0 Err bitreich.org 70 i 84 else Err bitreich.org 70 i 85 preformat=1 Err bitreich.org 70 i 86 fi Err bitreich.org 70 i 87 ;; Err bitreich.org 70 i 88 "=>"*) Err bitreich.org 70 i 89 if [ $preformat -eq 1 ]; Err bitreich.org 70 i 90 then Err bitreich.org 70 i 91 printf "i%s\tErr\t%s\t%s\r\n" "$(untabtext "${line}")" \ Err bitreich.org 70 i 92 "${host}" "${port}" Err bitreich.org 70 i 93 continue Err bitreich.org 70 i 94 fi Err bitreich.org 70 i 95 geminiuri="$(printf "%s\n" "${line}" \ Err bitreich.org 70 i 96 | sed -e 's,^=>[ \t]*\([^ \t]*\).*$,\1,g')" Err bitreich.org 70 i 97 geminidesc="$(printf "%s\n" "${line}" \ Err bitreich.org 70 i 98 | sed -e 's,^=>[ \t]*[^ \t]*[ \t]*\(.*\)$,\1,g')" Err bitreich.org 70 i 99 Err bitreich.org 70 i 100 gophertype="9" Err bitreich.org 70 i 101 gopherhost="${host}" Err bitreich.org 70 i 102 gopherport="${port}" Err bitreich.org 70 i 103 gopherselector="" Err bitreich.org 70 i 104 if [ -z "${geminidesc}" ]; Err bitreich.org 70 i 105 then Err bitreich.org 70 i 106 gopherdesc="${geminiuri}" Err bitreich.org 70 i 107 else Err bitreich.org 70 i 108 gopherdesc="${geminidesc}" Err bitreich.org 70 i 109 fi Err bitreich.org 70 i 110 case "${geminiuri}" in Err bitreich.org 70 i 111 gopher*) Err bitreich.org 70 i 112 gopherhost="$(printf "%s\n" "${geminiuri}" | cut -d'/' -f 3)" Err bitreich.org 70 i 113 [ -z "${geminihost}" ] && exit 1 Err bitreich.org 70 i 114 gopherport="$(printf "%s\n" "${gopherhost}" | cut -d':' -f 2)" Err bitreich.org 70 i 115 [ "${gopherport}" = "${gopherhost}" ] && gopherport="70" Err bitreich.org 70 i 116 gopherrequest="$(printf "%s\n" "${geminiuri}" | cut -d'/' -f 4-)" Err bitreich.org 70 i 117 # Gemini does not properly support Err bitreich.org 70 i 118 # gopher query requests. Err bitreich.org 70 i 119 # TODO: Fix gemini protocol. Err bitreich.org 70 i 120 gophertype="$(printf "%s\n" "${gopherrequest}" | cut -c 1)" Err bitreich.org 70 i 121 gopherselector="$(printf "%s\n" "${gopherrequest}" | cut -c 2-)" Err bitreich.org 70 i 122 ;; Err bitreich.org 70 i 123 gemini*) Err bitreich.org 70 i 124 gophertype="1" Err bitreich.org 70 i 125 gopherselector="${proxybase}${geminiuri}" Err bitreich.org 70 i 126 ;; Err bitreich.org 70 i 127 *) Err bitreich.org 70 i 128 gophertype="h" Err bitreich.org 70 i 129 gopherselector="URL:${geminiuri}" Err bitreich.org 70 i 130 ;; Err bitreich.org 70 i 131 esac Err bitreich.org 70 i 132 printf "%s%s\t%s\t%s\t%s\r\n" \ Err bitreich.org 70 i 133 "$gophertype" \ Err bitreich.org 70 i 134 "$(untabtext "$gopherdesc")" \ Err bitreich.org 70 i 135 "$gopherselector" \ Err bitreich.org 70 i 136 "$gopherhost" \ Err bitreich.org 70 i 137 "$gopherport" Err bitreich.org 70 i 138 ;; Err bitreich.org 70 i 139 *) Err bitreich.org 70 i 140 if [ $preformat -eq 1 ]; Err bitreich.org 70 i 141 then Err bitreich.org 70 i 142 printf "i%s\tErr\t%s\t%s\r\n" "$(untabtext "${line}")" \ Err bitreich.org 70 i 143 "${host}" "${port}" Err bitreich.org 70 i 144 else Err bitreich.org 70 i 145 { Err bitreich.org 70 i 146 printf "%s\n" "${line}" \ Err bitreich.org 70 i 147 | par-format -w 74 Err bitreich.org 70 i 148 } \ Err bitreich.org 70 i 149 | while read -r line; Err bitreich.org 70 i 150 do Err bitreich.org 70 i 151 printf "i%s\tErr\t%s\t%s\r\n" "$(untabtext "${line}")" \ Err bitreich.org 70 i 152 "$host" "$port" Err bitreich.org 70 i 153 done Err bitreich.org 70 i 154 fi Err bitreich.org 70 i 155 ;; Err bitreich.org 70 i 156 esac Err bitreich.org 70 i 157 done Err bitreich.org 70 i 158 ;; Err bitreich.org 70 i 159 esac Err bitreich.org 70 i 160 cat Err bitreich.org 70 i 161 } Err bitreich.org 70 i 162 Err bitreich.org 70 .