[libsoup/pgriffis/duplicate-soup-features] session: Forbid multiple features of the same type to be added




commit f57393eb09408379376db00b7d73e52ae86e2c12
Author: Patrick Griffis <pgriffis igalia com>
Date:   Tue May 25 09:50:02 2021 -0500

    session: Forbid multiple features of the same type to be added
    
    This can cause accidental conflicts and doesn't seem to be valuable
    with the current features.

 libsoup/Soup-3.0.metadata      |  1 -
 libsoup/soup-session-private.h |  3 +++
 libsoup/soup-session.c         | 23 ++++++++++++++++++++++-
 libsoup/soup-session.h         |  3 ---
 tests/session-test.c           |  1 +
 5 files changed, 26 insertions(+), 5 deletions(-)
---
diff --git a/libsoup/Soup-3.0.metadata b/libsoup/Soup-3.0.metadata
index 8174e825..1d8bf0d3 100644
--- a/libsoup/Soup-3.0.metadata
+++ b/libsoup/Soup-3.0.metadata
@@ -21,7 +21,6 @@ Message
 Server
        .new skip=false
 Session
-       .get_features type_arguments="weak Soup.SessionFeature"
        .send_async.cancellable#parameter default=null
 Session*.new_with_options skip=false
 
diff --git a/libsoup/soup-session-private.h b/libsoup/soup-session-private.h
index bef2f888..d27b8955 100644
--- a/libsoup/soup-session-private.h
+++ b/libsoup/soup-session-private.h
@@ -28,6 +28,9 @@ GInputStream *soup_session_setup_message_body_input_stream (SoupSession        *
                                                             GInputStream       *body_stream,
                                                             SoupProcessingStage start_at_stage);
 
+GSList       *soup_session_get_features                    (SoupSession        *session,
+                                                           GType               feature_type);
+
 G_END_DECLS
 
 #endif /* __SOUP_SESSION_PRIVATE_H__ */
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 68d7a026..5dbbce5e 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -2211,12 +2211,25 @@ soup_session_abort (SoupSession *session)
        g_slist_free (conns);
 }
 
+static gboolean
+feature_already_added (SoupSession *session, GType feature_type)
+{
+        if (soup_session_has_feature (session, feature_type)) {
+                        g_warning ("SoupSession already has a %s, ignoring new feature",
+                                   g_type_name (feature_type));
+                        return TRUE;
+                }
+
+        return FALSE;
+}
+
 /**
  * soup_session_add_feature:
  * @session: a #SoupSession
  * @feature: an object that implements #SoupSessionFeature
  *
- * Adds @feature's functionality to @session.
+ * Adds @feature's functionality to @session. You cannot add multiple
+ * features of the same #GType to a session.
  *
  * See the main #SoupSession documentation for information on what
  * features are present in sessions by default.
@@ -2231,6 +2244,10 @@ soup_session_add_feature (SoupSession *session, SoupSessionFeature *feature)
        g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
 
        priv = soup_session_get_instance_private (session);
+
+        if (feature_already_added (session, G_TYPE_FROM_INSTANCE (feature)))
+                return;
+
        priv->features = g_slist_prepend (priv->features, g_object_ref (feature));
        g_hash_table_remove_all (priv->features_cache);
        soup_session_feature_attach (feature, session);
@@ -2245,6 +2262,7 @@ soup_session_add_feature (SoupSession *session, SoupSessionFeature *feature)
  * #SoupSessionFeature, this creates a new feature of that type and
  * adds it to @session as with soup_session_add_feature(). You can use
  * this when you don't need to customize the new feature in any way.
+ * Adding multiple features of the same @feature_type is not allowed.
  *
  * If @feature_type is not a #SoupSessionFeature type, this gives each
  * existing feature on @session the chance to accept @feature_type as
@@ -2266,6 +2284,9 @@ soup_session_add_feature_by_type (SoupSession *session, GType feature_type)
        if (g_type_is_a (feature_type, SOUP_TYPE_SESSION_FEATURE)) {
                SoupSessionFeature *feature;
 
+                if (feature_already_added (session, feature_type))
+                        return;
+
                feature = g_object_new (feature_type, NULL);
                soup_session_add_feature (session, feature);
                g_object_unref (feature);
diff --git a/libsoup/soup-session.h b/libsoup/soup-session.h
index 61f07b66..624f580a 100644
--- a/libsoup/soup-session.h
+++ b/libsoup/soup-session.h
@@ -161,9 +161,6 @@ SOUP_AVAILABLE_IN_ALL
 gboolean            soup_session_has_feature            (SoupSession        *session,
                                                         GType               feature_type);
 SOUP_AVAILABLE_IN_ALL
-GSList             *soup_session_get_features           (SoupSession        *session,
-                                                        GType               feature_type);
-SOUP_AVAILABLE_IN_ALL
 SoupSessionFeature *soup_session_get_feature            (SoupSession        *session,
                                                         GType               feature_type);
 SOUP_AVAILABLE_IN_ALL
diff --git a/tests/session-test.c b/tests/session-test.c
index 9a4974e0..4a1596b3 100644
--- a/tests/session-test.c
+++ b/tests/session-test.c
@@ -1,6 +1,7 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
 
 #include "test-utils.h"
+#include "soup-session-private.h"
 
 static GUri *base_uri;
 static gboolean server_processed_message;


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