From c8aba752dae590a3239afb49e8fd8119cd015495 Mon Sep 17 00:00:00 2001 From: dtb Date: Fri, 9 Sep 2022 22:00:17 -0400 Subject: [PATCH] make it work with extensions --- xdg-sanity.sh | 66 +++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/xdg-sanity.sh b/xdg-sanity.sh index fb320c2..f5febec 100755 --- a/xdg-sanity.sh +++ b/xdg-sanity.sh @@ -1,7 +1,7 @@ #!/bin/sh +set -e argv0="$0" -argv1="$1" # cats out the configuration or {'\n', EOF} if it can't be found stream_config(){ @@ -23,6 +23,11 @@ if ! command -v curl >/dev/null 2>&1; then exit 71 # sysexits(3) EX_OSERR fi +# check if we have handlr(1), but we might not need it +if ! command -v handlr >/dev/null 2>&1; then + alias handlr=false +fi + test -n "$BROWSER" || BROWSER="$(stream_config | sed -ne 's/^browser *= *//p')" # check if we have a $BROWSER @@ -31,39 +36,44 @@ if ! test -n "$BROWSER"; then %s: \$BROWSER not filled. Please place the path to your default browser's executable in /etc/xdg-sanity/xdg-sanity.conf -" "$0" +" "$argv0" exit 71 # sysexits(3) EX_OSERR fi -MIME="$(curl -s -o /dev/null -w '%{content_type}' $1 | sed 's/\;.*//' | xargs echo)" -# RESPONSE_CODE=$(curl -fLIs "$INPUT" | sed -ne 's/ [[:space:]]*$//p' | sed -ne 's|^HTTP/.\+ ||p') +while test -n "$1"; do + argv1="$1" -for EXT in /etc/xdg-sanity/extensions/*.sh; do - if [ "$EXT" = "/etc/xdg-sanity/extensions/*.sh" ]; then - echo "No extensions to load" - else - for EXT in /etc/xdg-sanity/extensions/*.sh; do - TYPE=$(cat $EXT | sed -ne 's/^# EXT-TYPE=//p' | tr -d '\n') - echo "Found $TYPE extension $EXT" + # use curl(1) to write out the request header's content_type, + # strip everything after the first semicolon, + # chop off any weird whitespace remnants + MIME="$(curl -Ls -o /dev/null -w '%{content_type}' $1 | sed 's/\;.*//' | xargs echo)" - if [ "$TYPE" = "replace" ]; then - echo "Modifying $INPUT..." - argv1=$($EXT "$argv1") - echo "Got $INPUT" - elif [ "$TYPE" = "mime" ]; then - echo "Modifying MIME type..." - MIME="$($EXT "$argv1")" - echo "Got $MIME" - fi - done + # RESPONSE_CODE=$(curl -fLIs "$INPUT" | sed -ne 's/ [[:space:]]*$//p' | sed -ne 's|^HTTP/.\+ ||p') + + for extension in /etc/xdg-sanity/extensions/*.sh; do + ! [ "$extension" = "/etc/xdg-sanity/extensions/*.sh" ] || break + # switch(extension_type) + case "$(sed -ne 's/^# EXT-TYPE=//p' <"$extension" | xargs echo)" in + replace) + argv1="$("$extension" "$argv1")" + ;; + mime) + argv1="$("$extension" "$argv1")" + ;; + esac + done + + # these commands may fail; this is intentional + if [ "$MIME" = "text/html" ]; then + "$BROWSER" "$argv1" + elif ! handlr launch "$MIME" -- "$argv1"; then + printf "%s: %s: handlr(1) failed: " "$argv0" "$argv1" + [ "$(command -v handlr)" = "false" ] \ + && printf "'handlr' program not found\n" \ + || printf "non-zero exit status\n" fi + shift done -# determine the MIME type, strip everything after the first semicolon, and -# check to see if it's HTML -if [ "$MIME"= "text/html" ]; then - $BROWSER "$1" -else - handlr launch "$MIME" -- "$1" -fi +exit 0