]> granicus.if.org Git - p11-kit/commitdiff
url: Encode directly to a buffer
authorStef Walter <stefw@gnome.org>
Tue, 21 May 2013 14:41:09 +0000 (16:41 +0200)
committerStef Walter <stefw@gnome.org>
Mon, 27 May 2013 08:46:11 +0000 (10:46 +0200)
common/tests/test-url.c
common/url.c
common/url.h
p11-kit/uri.c

index 4c625944dc50f22f5f2f879e2bf57e8d91fdcc26..892bf3ce0eb6eee0280aa8dff78cc5257d611a17 100644 (file)
@@ -120,28 +120,34 @@ static void
 test_encode (void)
 {
        const unsigned char *input = (unsigned char *)"TEST";
-       char *encoded;
-       size_t length;
+       p11_buffer buf;
+
+       if (!p11_buffer_init_null (&buf, 5))
+               assert_not_reached ();
 
-       encoded = p11_url_encode (input, input + 5, "", &length);
-       assert_str_eq ("%54%45%53%54%00", (char *)encoded);
-       assert_num_eq (15, length);
+       p11_url_encode (input, input + 5, "", &buf);
+       assert (p11_buffer_ok (&buf));
+       assert_str_eq ("%54%45%53%54%00", (char *)buf.data);
+       assert_num_eq (15, buf.len);
 
-       free (encoded);
+       p11_buffer_uninit (&buf);
 }
 
 static void
 test_encode_verbatim (void)
 {
        const unsigned char *input = (unsigned char *)"TEST";
-       char *encoded;
-       size_t length;
+       p11_buffer buf;
+
+       if (!p11_buffer_init_null (&buf, 5))
+               assert_not_reached ();
 
-       encoded = p11_url_encode (input, input + 5, "ES", &length);
-       assert_str_eq ("%54ES%54%00", (char *)encoded);
-       assert_num_eq (11, length);
+       p11_url_encode (input, input + 5, "ES", &buf);
+       assert (p11_buffer_ok (&buf));
+       assert_str_eq ("%54ES%54%00", (char *)buf.data);
+       assert_num_eq (11, buf.len);
 
-       free (encoded);
+       p11_buffer_uninit (&buf);
 }
 
 int
index 6ccf74d0daa43a6f2a307d8542f4d045da1c7e04..4b7e47be949b463a2865f7b6b5c371b628033037 100644 (file)
@@ -103,40 +103,31 @@ p11_url_decode (const char *value,
        return result;
 }
 
-char *
+void
 p11_url_encode (const unsigned char *value,
                 const unsigned char *end,
                 const char *verbatim,
-                size_t *length)
+                p11_buffer *buf)
 {
-       char *p;
-       char *result;
+       char hex[3];
 
        assert (value <= end);
 
-       /* Just allocate for worst case */
-       result = malloc (((end - value) * 3) + 1);
-       return_val_if_fail (result != NULL, NULL);
-
        /* Now loop through looking for escapes */
-       p = result;
        while (value != end) {
 
                /* These characters we let through verbatim */
                if (*value && strchr (verbatim, *value) != NULL) {
-                       *(p++) = *(value++);
+                       p11_buffer_add (buf, value, 1);
 
                /* All others get encoded */
                } else {
-                       *(p++) = '%';
-                       *(p++) = HEX_CHARS[((unsigned char)*value) >> 4];
-                       *(p++) = HEX_CHARS[((unsigned char)*value) & 0x0F];
-                       ++value;
+                       hex[0] = '%';
+                       hex[1] = HEX_CHARS[((unsigned char)*value) >> 4];
+                       hex[2] = HEX_CHARS[((unsigned char)*value) & 0x0F];
+                       p11_buffer_add (buf, hex, 3);
                }
-       }
 
-       *p = 0;
-       if (length)
-               *length = p - result;
-       return result;
+               ++value;
+       }
 }
index fa7938aa27b2b5beec9c6f21a1b2c53b2e43b98b..4ab1e43dfe2b601f4687f0d41e96a93a13929495 100644 (file)
@@ -36,6 +36,7 @@
 #ifndef P11_URL_H
 #define P11_URL_H
 
+#include "buffer.h"
 #include "compat.h"
 
 #include <stdlib.h>
@@ -51,9 +52,9 @@ unsigned char *       p11_url_decode        (const char *value,
                                              const char *skip,
                                              size_t *length);
 
-char *                p11_url_encode        (const unsigned char *value,
+void                  p11_url_encode        (const unsigned char *value,
                                              const unsigned char *end,
                                              const char *verbatim,
-                                             size_t *length);
+                                             p11_buffer *buf);
 
 #endif /* P11_URL_H */
index a811b92079ca1ad178e9da09242a53ed4f2fa37e..df069f4a3f2e885ae488a15a0069eedad03b2187 100644 (file)
@@ -625,6 +625,18 @@ p11_kit_uri_new (void)
        return uri;
 }
 
+static void
+format_name_equals (p11_buffer *buffer,
+                    bool *is_first,
+                    const char *name)
+{
+       if (!*is_first)
+               p11_buffer_add (buffer, ";", 1);
+       p11_buffer_add (buffer, name, -1);
+       p11_buffer_add (buffer, "=", 1);
+       *is_first = false;
+}
+
 static bool
 format_raw_string (p11_buffer *buffer,
                    bool *is_first,
@@ -635,12 +647,8 @@ format_raw_string (p11_buffer *buffer,
        if (!value)
                return true;
 
-       if (!*is_first)
-               p11_buffer_add (buffer, ";", 1);
-       p11_buffer_add (buffer, name, -1);
-       p11_buffer_add (buffer, "=", 1);
+       format_name_equals (buffer, is_first, name);
        p11_buffer_add (buffer, value, -1);
-       *is_first = false;
 
        return p11_buffer_ok (buffer);
 }
@@ -653,16 +661,14 @@ format_encode_string (p11_buffer *buffer,
                       size_t n_value,
                       bool force)
 {
-       char *encoded;
-       bool ret;
+       /* Not set */
+       if (!value)
+               return true;
 
-       encoded = p11_url_encode (value, value + n_value,
-                                 force ? "" : P11_URL_VERBATIM, NULL);
-       return_val_if_fail (encoded != NULL, false);
+       format_name_equals (buffer, is_first, name);
+       p11_url_encode (value, value + n_value, force ? "" : P11_URL_VERBATIM, buffer);
 
-       ret = format_raw_string (buffer, is_first, name, encoded);
-       free (encoded);
-       return ret;
+       return p11_buffer_ok (buffer);
 }