[libsoup/carlosgc/form-message] forms: remove soup_form_request_new APIs




commit 7794572ab1b8aceac43756b6d4f006377a1442ae
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Wed Nov 4 08:02:01 2020 +0100

    forms: remove soup_form_request_new APIs
    
    Add soup_message_new_from_encoded_form() and
    soup_message_new_from_multipart() instead.

 docs/reference/libsoup-3.0-sections.txt |   6 +-
 libsoup/soup-form.c                     | 142 --------------------------------
 libsoup/soup-form.h                     |  17 ----
 libsoup/soup-message.c                  |  94 +++++++++++++++++++++
 libsoup/soup-message.h                  |  18 +++-
 tests/forms-test.c                      |  61 ++++++++++++--
 6 files changed, 165 insertions(+), 173 deletions(-)
---
diff --git a/docs/reference/libsoup-3.0-sections.txt b/docs/reference/libsoup-3.0-sections.txt
index 8059d6ef..2c590efe 100644
--- a/docs/reference/libsoup-3.0-sections.txt
+++ b/docs/reference/libsoup-3.0-sections.txt
@@ -6,6 +6,8 @@ SoupMessage
 <SUBSECTION>
 soup_message_new
 soup_message_new_from_uri
+soup_message_new_from_encoded_form
+soup_message_new_from_multipart
 soup_message_set_request_body
 soup_message_set_request_body_from_bytes
 <SUBSECTION>
@@ -582,10 +584,6 @@ soup_form_encode
 soup_form_encode_datalist
 soup_form_encode_hash
 soup_form_encode_valist
-soup_form_request_new
-soup_form_request_new_from_datalist
-soup_form_request_new_from_hash
-soup_form_request_new_from_multipart
 </SECTION>
 
 <SECTION>
diff --git a/libsoup/soup-form.c b/libsoup/soup-form.c
index 23cd007e..c0391444 100644
--- a/libsoup/soup-form.c
+++ b/libsoup/soup-form.c
@@ -346,145 +346,3 @@ soup_form_encode_valist (const char *first_field, va_list args)
 
        return g_string_free (str, FALSE);
 }
-
-static SoupMessage *
-soup_form_request_for_data (const char *method, const char *uri_string,
-                           char *form_data)
-{
-       SoupMessage *msg;
-       SoupURI *uri;
-
-       uri = soup_uri_new (uri_string);
-       if (!uri)
-               return NULL;
-
-       if (!strcmp (method, "GET")) {
-               g_free (uri->query);
-               uri->query = form_data;
-
-               msg = soup_message_new_from_uri (method, uri);
-       } else if (!strcmp (method, "POST") || !strcmp (method, "PUT")) {
-               GBytes *body;
-
-               msg = soup_message_new_from_uri (method, uri);
-
-               body = g_bytes_new_take (form_data, strlen (form_data));
-               soup_message_set_request_body_from_bytes (msg, SOUP_FORM_MIME_TYPE_URLENCODED, body);
-               g_bytes_unref (body);
-       } else {
-               g_warning ("invalid method passed to soup_form_request_new");
-               g_free (form_data);
-
-               /* Don't crash */
-               msg = soup_message_new_from_uri (method, uri);
-       }
-       soup_uri_free (uri);
-
-       return msg;
-}
-
-/**
- * soup_form_request_new:
- * @method: the HTTP method, either "GET" or "POST"
- * @uri: the URI to send the form data to
- * @first_field: name of the first form field
- * @...: value of @first_field, followed by additional field names
- * and values, terminated by %NULL.
- *
- * Creates a new %SoupMessage and sets it up to send the given data
- * to @uri via @method. (That is, if @method is "GET", it will encode
- * the form data into @uri's query field, and if @method is "POST", it
- * will encode it into the %SoupMessage's request_body.)
- *
- * Return value: (transfer full): the new %SoupMessage
- **/
-SoupMessage *
-soup_form_request_new (const char *method, const char *uri,
-                      const char  *first_field, ...)
-{
-       va_list args;
-       char *form_data;
-
-       va_start (args, first_field);
-       form_data = soup_form_encode_valist (first_field, args);
-       va_end (args);
-
-       return soup_form_request_for_data (method, uri, form_data);
-}
-
-/**
- * soup_form_request_new_from_hash:
- * @method: the HTTP method, either "GET" or "POST"
- * @uri: the URI to send the form data to
- * @form_data_set: (element-type utf8 utf8): the data to send to @uri
- *
- * Creates a new %SoupMessage and sets it up to send @form_data_set to
- * @uri via @method, as with soup_form_request_new().
- *
- * Return value: (transfer full): the new %SoupMessage
- **/
-SoupMessage *
-soup_form_request_new_from_hash (const char *method, const char *uri,
-                                GHashTable *form_data_set)
-{
-       return soup_form_request_for_data (
-               method, uri, soup_form_encode_hash (form_data_set));
-}
-
-/**
- * soup_form_request_new_from_datalist:
- * @method: the HTTP method, either "GET" or "POST"
- * @uri: the URI to send the form data to
- * @form_data_set: the data to send to @uri
- *
- * Creates a new %SoupMessage and sets it up to send @form_data_set to
- * @uri via @method, as with soup_form_request_new().
- *
- * Return value: (transfer full): the new %SoupMessage
- **/
-SoupMessage *
-soup_form_request_new_from_datalist (const char *method, const char *uri,
-                                    GData **form_data_set)
-{
-       return soup_form_request_for_data (
-               method, uri, soup_form_encode_datalist (form_data_set));
-}
-
-/**
- * soup_form_request_new_from_multipart:
- * @uri: the URI to send the form data to
- * @multipart: a "multipart/form-data" #SoupMultipart
- *
- * Creates a new %SoupMessage and sets it up to send @multipart to
- * @uri via POST.
- *
- * To send a <literal>"multipart/form-data"</literal> POST, first
- * create a #SoupMultipart, using %SOUP_FORM_MIME_TYPE_MULTIPART as
- * the MIME type. Then use soup_multipart_append_form_string() and
- * soup_multipart_append_form_file() to add the value of each form
- * control to the multipart. (These are just convenience methods, and
- * you can use soup_multipart_append_part() if you need greater
- * control over the part headers.) Finally, call
- * soup_form_request_new_from_multipart() to serialize the multipart
- * structure and create a #SoupMessage.
- *
- * Return value: (transfer full): the new %SoupMessage
- *
- * Since: 2.26
- **/
-SoupMessage *
-soup_form_request_new_from_multipart (const char *uri,
-                                     SoupMultipart *multipart)
-{
-       SoupMessage *msg;
-       GBytes *body = NULL;
-
-       msg = soup_message_new ("POST", uri);
-       soup_multipart_to_message (multipart, soup_message_get_request_headers (msg), &body);
-       soup_message_set_request_body_from_bytes (msg,
-                                                 soup_message_headers_get_content_type 
(soup_message_get_request_headers (msg), NULL),
-                                                 body);
-       g_bytes_unref (body);
-
-       return msg;
-}
diff --git a/libsoup/soup-form.h b/libsoup/soup-form.h
index 27ca8aa1..c841512b 100644
--- a/libsoup/soup-form.h
+++ b/libsoup/soup-form.h
@@ -34,23 +34,6 @@ SOUP_AVAILABLE_IN_2_4
 char        *soup_form_encode_valist    (const char   *first_field,
                                         va_list       args);
 
-SOUP_AVAILABLE_IN_2_4
-SoupMessage *soup_form_request_new                (const char     *method,
-                                                  const char     *uri,
-                                                  const char     *first_field,
-                                                  ...) G_GNUC_NULL_TERMINATED;
-SOUP_AVAILABLE_IN_2_4
-SoupMessage *soup_form_request_new_from_hash      (const char     *method,
-                                                  const char     *uri,
-                                                  GHashTable     *form_data_set);
-SOUP_AVAILABLE_IN_2_4
-SoupMessage *soup_form_request_new_from_datalist  (const char     *method,
-                                                  const char     *uri,
-                                                  GData         **form_data_set);
-SOUP_AVAILABLE_IN_2_26
-SoupMessage *soup_form_request_new_from_multipart (const char     *uri,
-                                                  SoupMultipart  *multipart);
-
 G_END_DECLS
 
 #endif /* __SOUP_FORM_H__ */
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index 4a68af2f..19d6b1fd 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -796,6 +796,100 @@ soup_message_new_from_uri (const char *method, SoupURI *uri)
                             NULL);
 }
 
+/**
+ * soup_message_new_from_encoded_form:
+ * @method: the HTTP method for the created request (GET, POST or PUT)
+ * @uri_string: the destination endpoint (as a string)
+ * @encoded_form: (transfer full): a encoded form
+ *
+ * Creates a new #SoupMessage and sets it up to send the given @encoded_form
+ * to @uri via @method. If @method is "GET", it will include the form data
+ * into @uri's query field, and if @method is "POST" or "PUT", it will be set as
+ * request body.
+ * This function takes the ownership of @encoded_form, that will be released
+ * with g_free() when no longer in use. See also soup_form_encode(),
+ * soup_form_encode_hash() and soup_form_encode_datalist().
+ *
+ * Returns: (transfer full) (nullable): the new #SoupMessage, or %NULL if @uri_string
+ *     could not be parsed or @method is not "GET, "POST" or "PUT"
+ */
+SoupMessage *
+soup_message_new_from_encoded_form (const char *method,
+                                    const char *uri_string,
+                                    char       *encoded_form)
+{
+        SoupMessage *msg = NULL;
+        SoupURI *uri;
+
+        g_return_val_if_fail (method != NULL, NULL);
+        g_return_val_if_fail (uri_string != NULL, NULL);
+        g_return_val_if_fail (encoded_form != NULL, NULL);
+
+        uri = soup_uri_new (uri_string);
+        if (!uri || !uri->host) {
+                g_free (encoded_form);
+                soup_uri_free (uri);
+                return NULL;
+        }
+
+        if (strcmp (method, "GET") == 0) {
+                g_free (uri->query);
+                uri->query = encoded_form;
+                msg = soup_message_new_from_uri (method, uri);
+        } else if (strcmp (method, "POST") == 0 || strcmp (method, "PUT") == 0) {
+                GBytes *body;
+
+                msg = soup_message_new_from_uri (method, uri);
+                body = g_bytes_new_take (encoded_form, strlen (encoded_form));
+                soup_message_set_request_body_from_bytes (msg, SOUP_FORM_MIME_TYPE_URLENCODED, body);
+                g_bytes_unref (body);
+        } else {
+                g_free (encoded_form);
+        }
+
+        soup_uri_free (uri);
+
+        return msg;
+}
+
+/**
+ * soup_message_new_from_multipart:
+ * @uri_string: the destination endpoint (as a string)
+ * @multipart: a #SoupMultipart
+ *
+ * Creates a new #SoupMessage and sets it up to send @multipart to
+ * @uri_string via POST.
+ *
+ * Returns: (transfer full) (nullable): the new #SoupMessage, or %NULL if @uri_string
+ *     could not be parsed
+ */
+SoupMessage *
+soup_message_new_from_multipart (const char    *uri_string,
+                                 SoupMultipart *multipart)
+{
+        SoupMessage *msg = NULL;
+        SoupURI *uri;
+        GBytes *body = NULL;
+
+        g_return_val_if_fail (uri_string != NULL, NULL);
+        g_return_val_if_fail (multipart != NULL, NULL);
+
+        uri = soup_uri_new (uri_string);
+        if (!uri || !uri->host) {
+                soup_uri_free (uri);
+                return NULL;
+        }
+
+        msg = soup_message_new_from_uri ("POST", uri);
+        soup_multipart_to_message (multipart, soup_message_get_request_headers (msg), &body);
+        soup_message_set_request_body_from_bytes (msg,
+                                                  soup_message_headers_get_content_type 
(soup_message_get_request_headers (msg), NULL),
+                                                  body);
+        g_bytes_unref (body);
+
+        return msg;
+}
+
 /**
  * soup_message_set_request_body:
  * @msg: the message
diff --git a/libsoup/soup-message.h b/libsoup/soup-message.h
index 3e70dfbc..cdb1d014 100644
--- a/libsoup/soup-message.h
+++ b/libsoup/soup-message.h
@@ -9,6 +9,7 @@
 #include "soup-message-body.h"
 #include "soup-message-headers.h"
 #include "soup-method.h"
+#include "soup-multipart.h"
 
 G_BEGIN_DECLS
 
@@ -17,11 +18,20 @@ SOUP_AVAILABLE_IN_ALL
 G_DECLARE_FINAL_TYPE (SoupMessage, soup_message, SOUP, MESSAGE, GObject)
 
 SOUP_AVAILABLE_IN_2_4
-SoupMessage   *soup_message_new                 (const char        *method,
-                                                const char        *uri_string);
+SoupMessage   *soup_message_new                   (const char        *method,
+                                                  const char        *uri_string);
 SOUP_AVAILABLE_IN_2_4
-SoupMessage   *soup_message_new_from_uri        (const char        *method,
-                                                SoupURI           *uri);
+SoupMessage   *soup_message_new_from_uri          (const char        *method,
+                                                  SoupURI           *uri);
+
+SOUP_AVAILABLE_IN_ALL
+SoupMessage   *soup_message_new_from_encoded_form (const char        *method,
+                                                  const char        *uri_string,
+                                                  char              *encoded_form);
+
+SOUP_AVAILABLE_IN_ALL
+SoupMessage   *soup_message_new_from_multipart    (const char        *uri_string,
+                                                  SoupMultipart     *multipart);
 
 SOUP_AVAILABLE_IN_ALL
 void           soup_message_set_request_body    (SoupMessage       *msg,
diff --git a/tests/forms-test.c b/tests/forms-test.c
index 9d069a4c..f7d15630 100644
--- a/tests/forms-test.c
+++ b/tests/forms-test.c
@@ -36,7 +36,7 @@ static struct {
 };
 
 static void
-do_hello_test (int n, gboolean extra, const char *uri)
+do_hello_test_curl (int n, gboolean extra, const char *uri)
 {
        GPtrArray *args;
        char *title_arg = NULL, *name_arg = NULL;
@@ -86,7 +86,7 @@ do_hello_test (int n, gboolean extra, const char *uri)
 }
 
 static void
-do_hello_tests (gconstpointer uri)
+do_hello_tests_curl (gconstpointer uri)
 {
        int n;
 
@@ -96,8 +96,56 @@ do_hello_tests (gconstpointer uri)
        }
 
        for (n = 0; n < G_N_ELEMENTS (tests); n++) {
-               do_hello_test (n, FALSE, uri);
-               do_hello_test (n, TRUE, uri);
+               do_hello_test_curl (n, FALSE, uri);
+               do_hello_test_curl (n, TRUE, uri);
+       }
+}
+
+static void
+do_hello_test_libsoup (int n, gboolean extra, const char *uri)
+{
+       SoupSession *session;
+       SoupMessage *msg;
+       GData *data;
+       GBytes *body;
+
+       debug_printf (1, "%2d. '%s' '%s'%s: ", n * 2 + (extra ? 2 : 1),
+                     tests[n].title ? tests[n].title : "(null)",
+                     tests[n].name  ? tests[n].name  : "(null)",
+                     extra ? " + extra" : "");
+
+       g_datalist_init (&data);
+       if (tests[n].title)
+               g_datalist_set_data (&data, "title", (gpointer)tests[n].title);
+       if (tests[n].name)
+               g_datalist_set_data (&data, "n@me", (gpointer)tests[n].name);
+       if (extra)
+               g_datalist_set_data (&data, "extra", (gpointer)"something");
+
+       session = soup_test_session_new (SOUP_TYPE_SESSION, NULL);
+
+       msg = soup_message_new_from_encoded_form ("GET",
+                                                 uri,
+                                                 soup_form_encode_datalist (&data));
+       g_datalist_clear (&data);
+
+       body = soup_test_session_send (session, msg, NULL, NULL);
+       soup_test_assert_message_status (msg, SOUP_STATUS_OK);
+       g_assert_cmpmem (tests[n].result, strlen (tests[n].result), g_bytes_get_data (body, NULL), 
g_bytes_get_size (body));
+
+       g_bytes_unref (body);
+       g_object_unref (msg);
+       soup_test_session_abort_unref (session);
+}
+
+static void
+do_hello_tests_libsoup (gconstpointer uri)
+{
+       int n;
+
+       for (n = 0; n < G_N_ELEMENTS (tests); n++) {
+               do_hello_test_libsoup (n, FALSE, uri);
+               do_hello_test_libsoup (n, TRUE, uri);
        }
 }
 
@@ -204,7 +252,7 @@ do_md5_test_libsoup (gconstpointer data)
        g_bytes_unref (buffer);
        soup_multipart_append_form_string (multipart, "fmt", "text");
 
-       msg = soup_form_request_new_from_multipart (uri, multipart);
+       msg = soup_message_new_from_multipart (uri, multipart);
        soup_multipart_free (multipart);
 
        session = soup_test_session_new (SOUP_TYPE_SESSION, NULL);
@@ -456,7 +504,8 @@ main (int argc, char **argv)
 
        if (run_tests) {
                uri = soup_uri_new_with_base (base_uri, "/hello");
-               g_test_add_data_func_full ("/forms/hello", soup_uri_to_string (uri, FALSE), do_hello_tests, 
g_free);
+               g_test_add_data_func_full ("/forms/hello/curl", soup_uri_to_string (uri, FALSE), 
do_hello_tests_curl, g_free);
+               g_test_add_data_func_full ("/forms/hello/libsoup", soup_uri_to_string (uri, FALSE), 
do_hello_tests_libsoup, g_free);
                soup_uri_free (uri);
 
                uri = soup_uri_new_with_base (base_uri, "/md5");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]