[libsoup] SoupRequest: add soup_request_disable_feature()
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup] SoupRequest: add soup_request_disable_feature()
- Date: Mon, 10 Dec 2012 16:17:01 +0000 (UTC)
commit 53c270d0e2868fa5ad48ce864f10a9486b11a071
Author: Dan Winship <danw gnome org>
Date: Wed Jul 25 09:20:32 2012 -0400
SoupRequest: add soup_request_disable_feature()
Add soup_request_disable_feature(), which proxies to
soup_message_disable_feature() for SoupRequestHTTP and is a no-op
otherwise.
Add SoupRequest tests to sniffing-test, which also tests
soup_request_disable_feature() now.
docs/reference/libsoup-2.4-sections.txt | 2 +
libsoup/libsoup-2.4.sym | 1 +
libsoup/soup-request.c | 29 +++++++
libsoup/soup-request.h | 4 +
tests/sniffing-test.c | 126 ++++++++++++++++++-------------
5 files changed, 111 insertions(+), 51 deletions(-)
---
diff --git a/docs/reference/libsoup-2.4-sections.txt b/docs/reference/libsoup-2.4-sections.txt
index 52cdc37..4697853 100644
--- a/docs/reference/libsoup-2.4-sections.txt
+++ b/docs/reference/libsoup-2.4-sections.txt
@@ -1112,6 +1112,8 @@ soup_request_get_content_type
soup_request_get_session
soup_request_get_uri
<SUBSECTION>
+soup_request_disable_feature
+<SUBSECTION>
SOUP_REQUEST_SESSION
SOUP_REQUEST_URI
<SUBSECTION Standard>
diff --git a/libsoup/libsoup-2.4.sym b/libsoup/libsoup-2.4.sym
index 63fda17..900cb04 100644
--- a/libsoup/libsoup-2.4.sym
+++ b/libsoup/libsoup-2.4.sym
@@ -317,6 +317,7 @@ soup_requester_get_type
soup_requester_new
soup_requester_request
soup_requester_request_uri
+soup_request_disable_feature
soup_request_error_get_type
soup_request_error_quark
soup_request_file_get_file
diff --git a/libsoup/soup-request.c b/libsoup/soup-request.c
index e19547b..5fd4a02 100644
--- a/libsoup/soup-request.c
+++ b/libsoup/soup-request.c
@@ -376,3 +376,32 @@ soup_request_get_content_type (SoupRequest *request)
{
return SOUP_REQUEST_GET_CLASS (request)->get_content_type (request);
}
+
+/**
+ * soup_request_disable_feature:
+ * @request: a #SoupRequest
+ * @feature_type: the #GType of a #SoupSessionFeature
+ *
+ * This disables the actions of #SoupSessionFeature<!-- -->s with the
+ * given @feature_type (or a subclass of that type) on @request, so
+ * that @request is processed as though the feature(s) hadn't been
+ * added to the session. Eg, passing #SOUP_TYPE_PROXY_URI_RESOLVER for
+ * @feature_type will disable proxy handling and cause @request to be
+ * sent directly to the indicated origin server, regardless of system
+ * proxy configuration.
+ *
+ * Since: 2.42
+ */
+void
+soup_request_disable_feature (SoupRequest *request,
+ GType feature_type)
+{
+ SoupMessage *msg;
+
+ /* For now, features only affect SoupMessages, so... */
+ if (SOUP_IS_REQUEST_HTTP (request)) {
+ msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
+ soup_message_disable_feature (msg, feature_type);
+ g_object_unref (msg);
+ }
+}
diff --git a/libsoup/soup-request.h b/libsoup/soup-request.h
index 84ad6d6..e44a7f2 100644
--- a/libsoup/soup-request.h
+++ b/libsoup/soup-request.h
@@ -98,6 +98,10 @@ goffset soup_request_get_content_length (SoupRequest *request);
SOUP_AVAILABLE_IN_2_34
const char *soup_request_get_content_type (SoupRequest *request);
+SOUP_AVAILABLE_IN_2_42
+void soup_request_disable_feature (SoupRequest *request,
+ GType feature_type);
+
G_END_DECLS
#endif /* SOUP_REQUEST_H */
diff --git a/tests/sniffing-test.c b/tests/sniffing-test.c
index 0b5fe19..e77154e 100644
--- a/tests/sniffing-test.c
+++ b/tests/sniffing-test.c
@@ -233,13 +233,6 @@ got_chunk (SoupMessage *msg, SoupBuffer *chunk, gpointer data)
}
static void
-finished (SoupSession *session, SoupMessage *msg, gpointer data)
-{
- GMainLoop *loop = (GMainLoop*)data;
- g_main_loop_quit (loop);
-}
-
-static void
do_signals_test (gboolean should_content_sniff,
gboolean should_pause,
gboolean should_accumulate,
@@ -248,7 +241,6 @@ do_signals_test (gboolean should_content_sniff,
{
SoupURI *uri = soup_uri_new_with_base (base_uri, "/mbox");
SoupMessage *msg = soup_message_new_from_uri ("GET", uri);
- GMainLoop *loop = g_main_loop_new (NULL, TRUE);
char *contents;
gsize length;
GError *error = NULL;
@@ -283,10 +275,7 @@ do_signals_test (gboolean should_content_sniff,
"signal::content_sniffed", content_sniffed, GINT_TO_POINTER (should_pause),
NULL);
- g_object_ref (msg);
- soup_session_queue_message (session, msg, finished, loop);
-
- g_main_loop_run (loop);
+ soup_session_send_message (session, msg);
if (!should_content_sniff &&
g_object_get_data (G_OBJECT (msg), "content-sniffed")) {
@@ -338,7 +327,6 @@ do_signals_test (gboolean should_content_sniff,
soup_uri_free (uri);
g_object_unref (msg);
- g_main_loop_unref (loop);
}
static void
@@ -347,91 +335,124 @@ sniffing_content_sniffed (SoupMessage *msg, const char *content_type,
{
char **sniffed_type = (char **)data;
GString *full_header;
- GList *keys;
- GList *iter;
+ GHashTableIter iter;
+ gpointer key, value;
full_header = g_string_new (content_type);
- keys = g_hash_table_get_keys (params);
- for (iter = keys; iter != NULL; iter = iter->next) {
- const gchar *value = (const gchar*) g_hash_table_lookup (params, iter->data);
-
- g_string_append (full_header, "; ");
+ g_hash_table_iter_init (&iter, params);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ if (full_header->len)
+ g_string_append (full_header, "; ");
soup_header_g_string_append_param (full_header,
- (const gchar*) iter->data,
- value);
+ (const char *) key,
+ (const char *) value);
}
- *sniffed_type = full_header->str;
-
- g_string_free (full_header, FALSE);
- g_list_free (keys);
+ *sniffed_type = g_string_free (full_header, FALSE);
}
static void
test_sniffing (const char *path, const char *expected_type)
{
- SoupURI *uri = soup_uri_new_with_base (base_uri, path);
- SoupMessage *msg = soup_message_new_from_uri ("GET", uri);
- GMainLoop *loop = g_main_loop_new (NULL, TRUE);
+ SoupURI *uri;
+ SoupMessage *msg;
+ SoupRequest *req;
+ GInputStream *stream;
char *sniffed_type = NULL;
+ GError *error = NULL;
debug_printf (1, "test_sniffing(\"%s\", \"%s\")\n", path, expected_type);
+ uri = soup_uri_new_with_base (base_uri, path);
+ msg = soup_message_new_from_uri ("GET", uri);
+
g_signal_connect (msg, "content-sniffed",
G_CALLBACK (sniffing_content_sniffed), &sniffed_type);
- g_object_ref (msg);
-
- soup_session_queue_message (session, msg, finished, loop);
-
- g_main_loop_run (loop);
-
+ soup_session_send_message (session, msg);
if (!sniffed_type) {
debug_printf (1, " message was not sniffed!\n");
errors++;
} else if (strcmp (sniffed_type, expected_type) != 0) {
- debug_printf (1, " sniffing failed! expected %s, got %s\n",
+ debug_printf (1, " message sniffing failed! expected %s, got %s\n",
expected_type, sniffed_type);
errors++;
}
g_free (sniffed_type);
+ g_object_unref (msg);
+
+ req = soup_session_request_uri (session, uri, NULL);
+ stream = soup_test_request_send (req, NULL, &error);
+ if (stream)
+ soup_test_request_close_stream (req, stream, NULL, &error);
+ if (error) {
+ debug_printf (1, " request failed: %s\n", error->message);
+ g_clear_error (&error);
+ } else {
+ const char *req_sniffed_type;
+
+ req_sniffed_type = soup_request_get_content_type (req);
+ if (strcmp (req_sniffed_type, expected_type) != 0) {
+ debug_printf (1, " request sniffing failed! expected %s, got %s\n",
+ expected_type, req_sniffed_type);
+ errors++;
+ }
+ }
+ g_object_unref (req);
soup_uri_free (uri);
- g_object_unref (msg);
- g_main_loop_unref (loop);
}
static void
test_disabled (const char *path)
{
- SoupURI *uri = soup_uri_new_with_base (base_uri, path);
- SoupMessage *msg = soup_message_new_from_uri ("GET", uri);
- GMainLoop *loop = g_main_loop_new (NULL, TRUE);
+ SoupURI *uri;
+ SoupMessage *msg;
+ SoupRequest *req;
+ GInputStream *stream;
char *sniffed_type = NULL;
-
- soup_message_disable_feature (msg, SOUP_TYPE_CONTENT_SNIFFER);
+ GError *error = NULL;
debug_printf (1, "test_disabled(\"%s\")\n", path);
- g_signal_connect (msg, "content-sniffed",
- G_CALLBACK (sniffing_content_sniffed), &sniffed_type);
+ uri = soup_uri_new_with_base (base_uri, path);
- g_object_ref (msg);
+ msg = soup_message_new_from_uri ("GET", uri);
+ soup_message_disable_feature (msg, SOUP_TYPE_CONTENT_SNIFFER);
- soup_session_queue_message (session, msg, finished, loop);
+ g_signal_connect (msg, "content-sniffed",
+ G_CALLBACK (sniffing_content_sniffed), &sniffed_type);
- g_main_loop_run (loop);
+ soup_session_send_message (session, msg);
if (sniffed_type) {
debug_printf (1, " message was sniffed!\n");
errors++;
g_free (sniffed_type);
}
+ g_object_unref (msg);
+
+ req = soup_session_request_uri (session, uri, NULL);
+ soup_request_disable_feature (req, SOUP_TYPE_CONTENT_SNIFFER);
+ stream = soup_test_request_send (req, NULL, &error);
+ if (stream)
+ soup_test_request_close_stream (req, stream, NULL, &error);
+ if (error) {
+ debug_printf (1, " request failed: %s\n", error->message);
+ g_clear_error (&error);
+ } else {
+ const char *sniffed_content_type;
+
+ sniffed_content_type = soup_request_get_content_type (req);
+ if (sniffed_content_type != NULL) {
+ debug_printf (1, " request was sniffed!\n");
+ errors++;
+ }
+ }
+ g_object_unref (req);
soup_uri_free (uri);
- g_object_unref (msg);
- g_main_loop_unref (loop);
}
int
@@ -446,7 +467,9 @@ main (int argc, char **argv)
base_uri = soup_uri_new ("http://127.0.0.1/");
soup_uri_set_port (base_uri, soup_server_get_port (server));
- session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
+ session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
+ SOUP_SESSION_USE_THREAD_CONTEXT, TRUE,
+ NULL);
/* No sniffer, no content_sniffed should be emitted */
do_signals_test (FALSE, FALSE, FALSE, FALSE, FALSE);
@@ -552,6 +575,7 @@ main (int argc, char **argv)
soup_test_session_abort_unref (session);
soup_test_server_quit_unref (server);
+
test_cleanup ();
return errors != 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]