summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2020-11-06 11:59:35 +0100
committerPatrick Griffis <tingping@tingping.se>2020-11-07 19:34:02 +0000
commit03a081c6817f1e3928e276aada2a9cb14bf23598 (patch)
tree6d54afe1bbb3ce71d8ecd5dba68389e1d83854b0
parent3e4f9dc0f0bfe2bbbfc80a8295d4da1ffa87f619 (diff)
downloadlibsoup-03a081c6817f1e3928e276aada2a9cb14bf23598.tar.gz
message: add convenient API to add, remove and query flags
-rw-r--r--docs/reference/libsoup-3.0-sections.txt3
-rw-r--r--libsoup/soup-message.c62
-rw-r--r--libsoup/soup-message.h12
-rw-r--r--tests/misc-test.c58
4 files changed, 135 insertions, 0 deletions
diff --git a/docs/reference/libsoup-3.0-sections.txt b/docs/reference/libsoup-3.0-sections.txt
index cd222b48..904e0b6c 100644
--- a/docs/reference/libsoup-3.0-sections.txt
+++ b/docs/reference/libsoup-3.0-sections.txt
@@ -38,6 +38,9 @@ soup_message_add_status_code_handler
SoupMessageFlags
soup_message_set_flags
soup_message_get_flags
+soup_message_add_flags
+soup_message_remove_flags
+soup_message_query_flags
<SUBSECTION>
soup_message_disable_feature
soup_message_is_feature_disabled
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index f36ffaa2..04424fda 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -1394,6 +1394,9 @@ soup_message_set_flags (SoupMessage *msg, SoupMessageFlags flags)
g_return_if_fail (SOUP_IS_MESSAGE (msg));
priv = soup_message_get_instance_private (msg);
+ if (priv->msg_flags == flags)
+ return;
+
priv->msg_flags = flags;
g_object_notify (G_OBJECT (msg), "flags");
}
@@ -1419,6 +1422,65 @@ soup_message_get_flags (SoupMessage *msg)
}
/**
+ * soup_message_add_flags:
+ * @msg: a #SoupMessage
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Adds @flags to the set of @msg's flags
+ */
+void
+soup_message_add_flags (SoupMessage *msg,
+ SoupMessageFlags flags)
+{
+ SoupMessagePrivate *priv;
+
+ g_return_if_fail (SOUP_IS_MESSAGE (msg));
+
+ priv = soup_message_get_instance_private (msg);
+ soup_message_set_flags (msg, priv->msg_flags | flags);
+}
+
+/**
+ * soup_message_query_flags:
+ * @msg: a #SoupMessage
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Queries if @flags are present in the set of @msg's flags
+ *
+ * Returns: %TRUE if @flags are enabled in @msg
+ */
+gboolean
+soup_message_query_flags (SoupMessage *msg,
+ SoupMessageFlags flags)
+{
+ SoupMessagePrivate *priv;
+
+ g_return_val_if_fail (SOUP_IS_MESSAGE (msg), FALSE);
+
+ priv = soup_message_get_instance_private (msg);
+ return priv->msg_flags & flags;
+}
+
+/**
+ * soup_message_remove_flags:
+ * @msg: a #SoupMessage
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Removes @flags from the set of @msg's flags
+ */
+void
+soup_message_remove_flags (SoupMessage *msg,
+ SoupMessageFlags flags)
+{
+ SoupMessagePrivate *priv;
+
+ g_return_if_fail (SOUP_IS_MESSAGE (msg));
+
+ priv = soup_message_get_instance_private (msg);
+ soup_message_set_flags (msg, priv->msg_flags & ~flags);
+}
+
+/**
* soup_message_set_http_version:
* @msg: a #SoupMessage
* @version: the HTTP version
diff --git a/libsoup/soup-message.h b/libsoup/soup-message.h
index cdb1d014..4b12478d 100644
--- a/libsoup/soup-message.h
+++ b/libsoup/soup-message.h
@@ -91,6 +91,18 @@ SOUP_AVAILABLE_IN_2_4
SoupMessageFlags soup_message_get_flags (SoupMessage *msg);
SOUP_AVAILABLE_IN_ALL
+void soup_message_add_flags (SoupMessage *msg,
+ SoupMessageFlags flags);
+
+SOUP_AVAILABLE_IN_ALL
+void soup_message_remove_flags (SoupMessage *msg,
+ SoupMessageFlags flags);
+
+SOUP_AVAILABLE_IN_ALL
+gboolean soup_message_query_flags (SoupMessage *msg,
+ SoupMessageFlags flags);
+
+SOUP_AVAILABLE_IN_ALL
GTlsCertificate *soup_message_get_tls_certificate (SoupMessage *msg);
SOUP_AVAILABLE_IN_ALL
diff --git a/tests/misc-test.c b/tests/misc-test.c
index 038cdbbc..53249c1d 100644
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -656,6 +656,63 @@ do_aliases_test (void)
soup_test_session_abort_unref (session);
}
+static void
+do_msg_flags_test (void)
+{
+ SoupMessage *msg;
+
+ msg = soup_message_new ("GET", "http://foo.org");
+
+ /* Flags are initially empty */
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, 0);
+ g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+
+ /* Set a single flag */
+ soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, SOUP_MESSAGE_NO_REDIRECT);
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+ g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION));
+
+ /* Add another flag */
+ soup_message_add_flags (msg, SOUP_MESSAGE_NEW_CONNECTION);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION));
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION));
+
+ /* Add an existing flag */
+ soup_message_add_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION));
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION));
+
+ /* Remove a single flag */
+ soup_message_remove_flags (msg, SOUP_MESSAGE_NEW_CONNECTION);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, SOUP_MESSAGE_NO_REDIRECT);
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+ g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION));
+
+ /* Remove a non-existing flag */
+ soup_message_remove_flags (msg, SOUP_MESSAGE_NEW_CONNECTION);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, SOUP_MESSAGE_NO_REDIRECT);
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+ g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION));
+
+ /* Add a set of flags */
+ soup_message_add_flags (msg, SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+
+ /* Remove a set of flags */
+ soup_message_remove_flags (msg, (SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_IDEMPOTENT));
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+ g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+
+ /* Remove all flags */
+ soup_message_set_flags (msg, 0);
+ g_assert_cmpuint (soup_message_get_flags (msg), ==, 0);
+ g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+
+ g_object_unref (msg);
+}
+
int
main (int argc, char **argv)
{
@@ -693,6 +750,7 @@ main (int argc, char **argv)
g_test_add_func ("/misc/cancel-while-reading/req/delayed", do_cancel_while_reading_delayed_req_test);
g_test_add_func ("/misc/cancel-while-reading/req/preemptive", do_cancel_while_reading_preemptive_req_test);
g_test_add_func ("/misc/aliases", do_aliases_test);
+ g_test_add_func ("/misc/msg-flags", do_msg_flags_test);
ret = g_test_run ();