[libsoup/carlosgc/message-flags: 1/5] message: add convenient API to add, remove and query flags
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup/carlosgc/message-flags: 1/5] message: add convenient API to add, remove and query flags
- Date: Fri, 6 Nov 2020 13:35:34 +0000 (UTC)
commit 3503ddff09539af21bb0c847b45437a55d52c6b0
Author: Carlos Garcia Campos <cgarcia igalia com>
Date: Fri Nov 6 11:59:35 2020 +0100
message: add convenient API to add, remove and query flags
docs/reference/libsoup-3.0-sections.txt | 3 ++
libsoup/soup-message.c | 62 +++++++++++++++++++++++++++++++++
libsoup/soup-message.h | 12 +++++++
tests/misc-test.c | 58 ++++++++++++++++++++++++++++++
4 files changed, 135 insertions(+)
---
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");
}
@@ -1418,6 +1421,65 @@ soup_message_get_flags (SoupMessage *msg)
return priv->msg_flags;
}
+/**
+ * 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
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
@@ -90,6 +90,18 @@ void soup_message_set_flags (SoupMessage *msg,
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);
diff --git a/tests/misc-test.c b/tests/misc-test.c
index 2d06f0c8..92f0661e 100644
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -662,6 +662,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)
{
@@ -699,6 +756,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 ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]