Add a portable URI escaping function

This commit is contained in:
styan 2020-05-24 05:34:14 +00:00
parent b3ee7a9849
commit a18262a60c
1 changed files with 26 additions and 4 deletions

View File

@ -50,6 +50,30 @@ geminawk() {
gsub(/'\''/, "'\''\\'\'''\''", s)
return ("'\''" s "'\''")
}
function uriescape(s, c) {
split(s, uriescape_a, "")
uriescape_cmd = "printf %s " escape(s) \
" | od -An -tx1 | tr a-z A-Z"
uriescape_hex = ""
while (uriescape_cmd | getline uriescape_line)
uriescape_hex = uriescape_hex uriescape_line
close(uriescape_cmd)
sub(/^[[:space:]]+/, "", uriescape_hex)
split(uriescape_hex, uriescape_x, /[[:space:]]+/)
s = ""
for (uriescape_i = 1; uriescape_i in uriescape_a;
uriescape_i++) {
uriescape_c = uriescape_a[uriescape_i]
if (uriescape_c ~ /[-.0-9A-Z_a-z~]/ || \
index(c, uriescape_c) > 0)
s = s uriescape_c
else
s = s "%" uriescape_x[uriescape_i]
}
delete uriescape_a
delete uriescape_x
return (s);
}
function command(u) {
url = u
sub(/^gemini:\/\//, "", url)
@ -97,11 +121,9 @@ geminawk() {
(i > 2 ? " " : "") $i
print prompt
getline
vis = "printf %s "escape($0)" | vis -h"
vis | getline
close(vis)
sub(/\?.*/, "", u)
u = u "?" $0
u = u "?" uriescape($0, \
"!$&'\''()*+,/:;=?@")
} else if ($1 ~ /^2/) { # OK
while (cmd | getline)
print