aboutsummaryrefslogtreecommitdiffhomepage
path: root/share/functions
diff options
context:
space:
mode:
authorGravatar Kevin Ballard <kevin@sb.org>2016-02-27 00:14:52 -0800
committerGravatar Kevin Ballard <kevin@sb.org>2016-02-27 00:14:52 -0800
commitd8a497434f8c22e698c049332b301b4ef4815c21 (patch)
tree642e0ce2a6fe4697f23f46a039243340ee647454 /share/functions
parent211829c586be316ac8e461f967d81a55d8ef57dd (diff)
Rewrite __fish_urlencode to not encode valid characters
Much better to only encode the characters that are not URL-safe. This also doesn't involve any forking, and it even handles newlines and NULs in the input.
Diffstat (limited to 'share/functions')
-rw-r--r--share/functions/__fish_urlencode.fish21
1 files changed, 16 insertions, 5 deletions
diff --git a/share/functions/__fish_urlencode.fish b/share/functions/__fish_urlencode.fish
index d17451f3..df07eee0 100644
--- a/share/functions/__fish_urlencode.fish
+++ b/share/functions/__fish_urlencode.fish
@@ -1,11 +1,22 @@
function __fish_urlencode --description "URL-encode stdin"
- set -l output
+ set -l join ''
set -l chars
# Set locale to C and IFS to "" in order to split a line into bytes.
- while begin; set -lx LC_ALL C; set -lx IFS ''; read --array chars; end
- if count $chars > /dev/null
- set output $output (printf '%%%02x' "'"$chars)
+ while begin; set -lx LC_ALL C; set -lx IFS ''; read -az chars; end
+ printf '%s' $join
+ # chomp off a trailing newline
+ if test "$chars[-1]" = \n
+ set -e chars[-1]
+ set join '%0A%00'
+ else
+ set join '%00'
+ end
+ for c in $chars
+ if string match -q -r '[/._~A-Za-z0-9-]' $c
+ printf '%s' $c
+ else
+ printf '%%%02X' "'$c"
+ end
end
end
- echo -s $output | sed -e 's/%2[fF]/\//g'
end