diff options
author | Kevin Ballard <kevin@sb.org> | 2016-02-27 00:14:52 -0800 |
---|---|---|
committer | Kevin Ballard <kevin@sb.org> | 2016-02-27 00:14:52 -0800 |
commit | d8a497434f8c22e698c049332b301b4ef4815c21 (patch) | |
tree | 642e0ce2a6fe4697f23f46a039243340ee647454 /share | |
parent | 211829c586be316ac8e461f967d81a55d8ef57dd (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')
-rw-r--r-- | share/functions/__fish_urlencode.fish | 21 |
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 |