From d8a497434f8c22e698c049332b301b4ef4815c21 Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Sat, 27 Feb 2016 00:14:52 -0800 Subject: [PATCH] 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. --- share/functions/__fish_urlencode.fish | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/share/functions/__fish_urlencode.fish b/share/functions/__fish_urlencode.fish index d17451f32..df07eee03 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