diff options
author | Charles E. Lehner <cel@celehner.com> | 2020-09-10 19:57:10 -0400 |
---|---|---|
committer | Charles E. Lehner <cel@celehner.com> | 2020-09-10 19:57:10 -0400 |
commit | 8eb8ce1848da1b753112e47581a151af87a4ca1b (patch) | |
tree | aa15d8ca80d1a23337e8ce9cd9dcc442e792e0b9 | |
parent | a303eeb15db19cc2ba5e6718222991de8d98dc04 (diff) |
Redirect automatically on input form submission
Following behavior of Philip Linde's gemini.filter.dpi
-rwxr-xr-x | gemini.filter.dpi | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/gemini.filter.dpi b/gemini.filter.dpi index 802255d..237729e 100755 --- a/gemini.filter.dpi +++ b/gemini.filter.dpi @@ -133,7 +133,8 @@ serve_missing_status() { serve_input() { printf "<cmd='start_send_page' url='' '>\n" - prompt=$1 + url=$1 + prompt=$2 # TODO: html-escape prompt printf "Content-type: text/html\r\n\r\n" cat <<-EOF @@ -143,9 +144,9 @@ serve_input() { <title>Input</title> </head> <body> - <form action="" method="get"> + <form action="gemini:input:$url" method=get> <h3>$prompt</h3> - <input name=_ style='width:100%'> + <input name=q style='width:100%'> <input type=submit> </form> </body> @@ -181,6 +182,24 @@ serve_redirect() { EOF } +serve_real_redirect() { + send_status_msg "Redirected" + printf "<cmd='start_send_page' url='' '>\n" + printf "Content-type: text/html\r\n\r\n" + # TODO: html-escape url + cat <<-EOF + <!doctype html> + <html> + <head> + <title>Redirecting to $url</title> + <meta http-equiv="Refresh" content="0; url=$url" /> + </head> + <body> + </body> + </html> + EOF +} + serve_error() { status=$1 meta=$2 @@ -221,6 +240,17 @@ serve_fail() { EOF } +serve_gemini_input() { + url=${1#gemini:input:} + + url_no_query=${url%%?q=*} + if [ "$url_no_query" != "$url" ]; then + url="${url_no_query}?${url#*?q=}" + fi + + serve_real_redirect "$url" +} + serve_gemini() { url=${1%%#*} url_noquery=${url%%\?*} @@ -237,14 +267,6 @@ serve_gemini() { port=${hostname##*:} url="gemini://$hostname/$path$query" - # replace "?_=" with "?". - # dillo can only submit forms with name=value items, but Gemini - # uses the whole querystring as a single string - url1=${url%%?_=*} - if [ "$url1" != "$url" ]; then - url="${url1}?${url#*?_=}" - fi - if [ "$host" = "$port" ]; then port=1965; fi send_status_msg "Sending request..." printf "%s\r\n" "$url" | openssl s_client -quiet -connect "$host:$port" | { @@ -252,7 +274,7 @@ serve_gemini() { send_status_msg "Status: $status" meta=$(echo "$meta" | sed 's/\s*$//') case "$status" in - 1*) serve_input "$meta";; + 1*) serve_input "$url" "$meta";; 2*) serve_success "$meta";; 3*) serve_redirect "$meta";; 4*) serve_error "$status" "$meta";; @@ -265,6 +287,7 @@ serve_gemini() { } case "$url" in + gemini:input:*) serve_gemini_input "$url";; gemini:*) serve_gemini "$url";; *) serve_404;; esac |