From cc37685f8b1671cc3e59b68d5021549c3bac3a13 Mon Sep 17 00:00:00 2001 From: sl Date: Wed, 10 Feb 2016 20:32:57 -0500 Subject: [PATCH] bin/cgilib.rc: hack urlencode/urldecode for UNIX *and* Plan 9 --- bin/cgilib.rc | 129 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 85 insertions(+), 44 deletions(-) diff --git a/bin/cgilib.rc b/bin/cgilib.rc index dd4bb6d..80ce28c 100755 --- a/bin/cgilib.rc +++ b/bin/cgilib.rc @@ -64,52 +64,93 @@ fn awk_buffer { END { printf "%s", buf }' } -fn urldecode { /bin/urlencode -d } +fn urldecode { $PLAN9/bin/urlencode -d || url_decode} # GROSS -#fn urldecode { -#awk ' -#BEGIN { -# hextab ["0"] = 0; hextab ["8"] = 8; -# hextab ["1"] = 1; hextab ["9"] = 9; -# hextab ["2"] = 2; hextab ["A"] = hextab ["a"] = 10 -# hextab ["3"] = 3; hextab ["B"] = hextab ["b"] = 11; -# hextab ["4"] = 4; hextab ["C"] = hextab ["c"] = 12; -# hextab ["5"] = 5; hextab ["D"] = hextab ["d"] = 13; -# hextab ["6"] = 6; hextab ["E"] = hextab ["e"] = 14; -# hextab ["7"] = 7; hextab ["F"] = hextab ["f"] = 15; -#} -#{ -# decoded = "" -# i = 1 -# len = length ($0) -# while ( i <= len ) { -# c = substr ($0, i, 1) -# if ( c == "%" ) { -# if ( i+2 <= len ) { -# c1 = substr ($0, i+1, 1) -# c2 = substr ($0, i+2, 1) -# if ( hextab [c1] == "" || hextab [c2] == "" ) { -# print "WARNING: invalid hex encoding: %" c1 c2 | "cat >&2" -# } else { -# code = 0 + hextab [c1] * 16 + hextab [c2] + 0 -# c = sprintf ("%c", code) -# i = i + 2 -# } -# } else { -# print "WARNING: invalid % encoding: " substr ($0, i, len - i) -# } -# } else if ( c == "+" ) { -# c = " " -# } -# decoded = decoded c -# ++i -# } -# printf "%s", decoded -#} -#' -#} +fn url_decode { +awk ' +BEGIN { + hextab ["0"] = 0; hextab ["8"] = 8; + hextab ["1"] = 1; hextab ["9"] = 9; + hextab ["2"] = 2; hextab ["A"] = hextab ["a"] = 10 + hextab ["3"] = 3; hextab ["B"] = hextab ["b"] = 11; + hextab ["4"] = 4; hextab ["C"] = hextab ["c"] = 12; + hextab ["5"] = 5; hextab ["D"] = hextab ["d"] = 13; + hextab ["6"] = 6; hextab ["E"] = hextab ["e"] = 14; + hextab ["7"] = 7; hextab ["F"] = hextab ["f"] = 15; +} +{ + decoded = "" + i = 1 + len = length ($0) + while ( i <= len ) { + c = substr ($0, i, 1) + if ( c == "%" ) { + if ( i+2 <= len ) { + c1 = substr ($0, i+1, 1) + c2 = substr ($0, i+2, 1) + if ( hextab [c1] == "" || hextab [c2] == "" ) { + print "WARNING: invalid hex encoding: %" c1 c2 | "cat >&2" + } else { + code = 0 + hextab [c1] * 16 + hextab [c2] + 0 + c = sprintf ("%c", code) + i = i + 2 + } + } else { + print "WARNING: invalid % encoding: " substr ($0, i, len - i) + } + } else if ( c == "+" ) { + c = " " + } + decoded = decoded c + ++i + } + printf "%s", decoded +} +' +} -fn url_encode { /bin/urlencode $* } +fn urlencode { $PLAN9/bin/urlencode $* || url_encode } # GROSS + +fn url_encode { + awk ' + BEGIN { + # We assume an awk implementation that is just plain dumb. + # We will convert an character to its ASCII value with the + # table ord[], and produce two-digit hexadecimal output + # without the printf("%02X") feature. + + EOL = "%0A" # "end of line" string (encoded) + split ("1 2 3 4 5 6 7 8 9 A B C D E F", hextab, " ") + hextab [0] = 0 + for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0 + if ("'^$"EncodeEOL^'" == "yes") EncodeEOL = 1; else EncodeEOL = 0 + } + { + encoded = "" + for ( i=1; i<=length ($0); ++i ) { + c = substr ($0, i, 1) + if ( c ~ /[a-zA-Z0-9.-]/ ) { + encoded = encoded c # safe character + } else if ( c == " " ) { + encoded = encoded "+" # special handling + } else { + # unsafe character, encode it as a two-digit hex-number + lo = ord [c] % 16 + hi = int (ord [c] / 16); + encoded = encoded "%" hextab [hi] hextab [lo] + } + } + if ( EncodeEOL ) { + printf ("%s", encoded EOL) + } else { + print encoded + } + } + END { + #if ( EncodeEOL ) print "" + } +' $* +} # Cookies fn set_cookie {