kn@ removed '~' from unsafe_chars but also changed the code at the same
time. This tries to bring the version in rpki-client back in sync with the
code in ftp(1).

-- 
:wq Claudio

Index: http.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/http.c,v
retrieving revision 1.49
diff -u -p -r1.49 http.c
--- http.c      9 Nov 2021 11:00:43 -0000       1.49
+++ http.c      9 Nov 2021 18:49:27 -0000
@@ -211,14 +211,17 @@ http_info(const char *uri)
 }
 
 /*
- * Determine whether the character needs encoding, per RFC1738:
- *     - No corresponding graphic US-ASCII.
- *     - Unsafe characters.
+ * Determine whether the character needs encoding, per RFC2396.
  */
 static int
-unsafe_char(const char *c0)
+to_encode(const char *c0)
 {
-       const char *unsafe_chars = " <>\"#{}|\\^~[]`";
+       /* 2.4.3. Excluded US-ASCII Characters */
+       const char *excluded_chars =
+           " "         /* space */
+           "<>#\""     /* delims (modulo "%", see below) */
+           "{}|\\^[]`" /* unwise */
+           ;
        const unsigned char *c = (const unsigned char *)c0;
 
        /*
@@ -228,16 +231,15 @@ unsafe_char(const char *c0)
        return (iscntrl(*c) || !isascii(*c) ||
 
            /*
-            * Unsafe characters.
-            * '%' is also unsafe, if is not followed by two
+            * '%' is also reserved, if is not followed by two
             * hexadecimal digits.
             */
-           strchr(unsafe_chars, *c) != NULL ||
+           strchr(excluded_chars, *c) != NULL ||
            (*c == '%' && (!isxdigit(c[1]) || !isxdigit(c[2]))));
 }
 
 /*
- * Encode given URL, per RFC1738.
+ * Encode given URL, per RFC2396.
  * Allocate and return string to the caller.
  */
 static char *
@@ -254,7 +256,7 @@ url_encode(const char *path)
         * final URL.
         */
        for (i = 0; i < length; i++)
-               if (unsafe_char(path + i))
+               if (to_encode(path + i))
                        new_length += 2;
 
        epath = epathp = malloc(new_length + 1);        /* One more for '\0'. */
@@ -266,7 +268,7 @@ url_encode(const char *path)
         * Encode, and copy final URL.
         */
        for (i = 0; i < length; i++)
-               if (unsafe_char(path + i)) {
+               if (to_encode(path + i)) {
                        snprintf(epathp, 4, "%%" "%02x",
                            (unsigned char)path[i]);
                        epathp += 3;

Reply via email to