diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-11-06 11:59:35 +0100 |
---|---|---|
committer | Patrick Griffis <tingping@tingping.se> | 2020-11-07 19:34:02 +0000 |
commit | 03a081c6817f1e3928e276aada2a9cb14bf23598 (patch) | |
tree | 6d54afe1bbb3ce71d8ecd5dba68389e1d83854b0 | |
parent | 3e4f9dc0f0bfe2bbbfc80a8295d4da1ffa87f619 (diff) | |
download | libsoup-03a081c6817f1e3928e276aada2a9cb14bf23598.tar.gz |
message: add convenient API to add, remove and query flags
-rw-r--r-- | docs/reference/libsoup-3.0-sections.txt | 3 | ||||
-rw-r--r-- | libsoup/soup-message.c | 62 | ||||
-rw-r--r-- | libsoup/soup-message.h | 12 | ||||
-rw-r--r-- | tests/misc-test.c | 58 |
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 (); |