[libsoup] SoupSession: add soup_session_request_http() and _request_http_uri()



commit 17499abfc0c1fc23c54114f09e8fec348a8bd42d
Author: Dan Winship <danw gnome org>
Date:   Wed Jul 25 09:35:58 2012 -0400

    SoupSession: add soup_session_request_http() and _request_http_uri()
    
    Add SoupSession helpers to return SoupRequestHTTP directly and allow
    overriding the request method.

 docs/reference/libsoup-2.4-sections.txt |    2 +
 libsoup/libsoup-2.4.sym                 |    2 +
 libsoup/soup-request-http.h             |    4 +-
 libsoup/soup-session.c                  |   88 +++++++++++++++++++++++++
 libsoup/soup-session.h                  |   22 +++++--
 libsoup/soup-types.h                    |    1 +
 tests/coding-test.c                     |  106 +++++++++++++------------------
 tests/redirect-test.c                   |   26 +++-----
 8 files changed, 166 insertions(+), 85 deletions(-)
---
diff --git a/docs/reference/libsoup-2.4-sections.txt b/docs/reference/libsoup-2.4-sections.txt
index 4697853..43388ef 100644
--- a/docs/reference/libsoup-2.4-sections.txt
+++ b/docs/reference/libsoup-2.4-sections.txt
@@ -389,6 +389,8 @@ SoupSession
 <SUBSECTION>
 soup_session_request
 soup_session_request_uri
+soup_session_request_http
+soup_session_request_http_uri
 SoupRequestError
 SOUP_REQUEST_ERROR
 <SUBSECTION>
diff --git a/libsoup/libsoup-2.4.sym b/libsoup/libsoup-2.4.sym
index 900cb04..aa302c6 100644
--- a/libsoup/libsoup-2.4.sym
+++ b/libsoup/libsoup-2.4.sym
@@ -382,6 +382,8 @@ soup_session_redirect_message
 soup_session_remove_feature
 soup_session_remove_feature_by_type
 soup_session_request
+soup_session_request_http
+soup_session_request_http_uri
 soup_session_request_uri
 soup_session_requeue_message
 soup_session_send_message
diff --git a/libsoup/soup-request-http.h b/libsoup/soup-request-http.h
index 58fbbfd..5335b10 100644
--- a/libsoup/soup-request-http.h
+++ b/libsoup/soup-request-http.h
@@ -37,7 +37,7 @@ G_BEGIN_DECLS
 
 typedef struct _SoupRequestHTTPPrivate SoupRequestHTTPPrivate;
 
-typedef struct {
+struct _SoupRequestHTTP {
 	SoupRequest parent;
 
 	/*< public >*/
@@ -54,7 +54,7 @@ typedef struct {
 	/*< private >*/
 	SoupRequestHTTPPrivate *priv;
 
-} SoupRequestHTTP;
+};
 
 typedef struct {
 	SoupRequestClass parent;
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 85d705a..94a2214 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -3803,6 +3803,94 @@ soup_session_request_uri (SoupSession *session, SoupURI *uri,
 			       NULL);
 }
 
+static SoupRequestHTTP *
+initialize_http_request (SoupRequest  *req,
+			 const char   *method,
+			 GError      **error)
+{
+	SoupRequestHTTP *http;
+	SoupMessage *msg;
+
+	if (!SOUP_IS_REQUEST_HTTP (req)) {
+		g_object_unref (req);
+		g_set_error (error, SOUP_REQUEST_ERROR,
+			     SOUP_REQUEST_ERROR_BAD_URI,
+			     _("Not an HTTP URI"));
+		return NULL;
+	}
+
+	http = SOUP_REQUEST_HTTP (req);
+	msg = soup_request_http_get_message (http);
+	g_object_set (G_OBJECT (msg),
+		      SOUP_MESSAGE_METHOD, method,
+		      NULL);
+	g_object_unref (msg);
+
+	return http;
+}
+
+/**
+ * soup_session_request_http:
+ * @session: a #SoupSession
+ * @method: an HTTP method
+ * @uri_string: a URI, in string form
+ * @error: return location for a #GError, or %NULL
+ *
+ * Creates a #SoupRequest for retrieving @uri_string, which must be an
+ * "http" or "https" URI (or another protocol listed in @session's
+ * #SoupSession:http-aliases or #SoupSession:https-aliases).
+ *
+ * Return value: (transfer full): a new #SoupRequestHTTP, or
+ *   %NULL on error.
+ *
+ * Since: 2.42
+ */
+SoupRequestHTTP *
+soup_session_request_http (SoupSession  *session,
+			   const char   *method,
+			   const char   *uri_string,
+			   GError      **error)
+{
+	SoupRequest *req;
+
+	req = soup_session_request (session, uri_string, error);
+	if (!req)
+		return NULL;
+
+	return initialize_http_request (req, method, error);
+}
+
+/**
+ * soup_session_request_http_uri:
+ * @session: a #SoupSession
+ * @method: an HTTP method
+ * @uri: a #SoupURI representing the URI to retrieve
+ * @error: return location for a #GError, or %NULL
+ *
+ * Creates a #SoupRequest for retrieving @uri, which must be an
+ * "http" or "https" URI (or another protocol listed in @session's
+ * #SoupSession:http-aliases or #SoupSession:https-aliases).
+ *
+ * Return value: (transfer full): a new #SoupRequestHTTP, or
+ *   %NULL on error.
+ *
+ * Since: 2.42
+ */
+SoupRequestHTTP *
+soup_session_request_http_uri (SoupSession  *session,
+			       const char   *method,
+			       SoupURI      *uri,
+			       GError      **error)
+{
+	SoupRequest *req;
+
+	req = soup_session_request_uri (session, uri, error);
+	if (!req)
+		return NULL;
+
+	return initialize_http_request (req, method, error);
+}
+
 /**
  * SOUP_REQUEST_ERROR:
  *
diff --git a/libsoup/soup-session.h b/libsoup/soup-session.h
index 0390862..ca5060e 100644
--- a/libsoup/soup-session.h
+++ b/libsoup/soup-session.h
@@ -149,13 +149,23 @@ SoupSessionFeature *soup_session_get_feature_for_message(SoupSession        *ses
 							 SoupMessage        *msg);
 
 SOUP_AVAILABLE_IN_2_42
-SoupRequest *soup_session_request     (SoupSession  *session,
-				       const char   *uri_string,
-				       GError      **error);
+SoupRequest     *soup_session_request          (SoupSession  *session,
+						const char   *uri_string,
+						GError      **error);
 SOUP_AVAILABLE_IN_2_42
-SoupRequest *soup_session_request_uri (SoupSession  *session,
-				       SoupURI      *uri,
-				       GError      **error);
+SoupRequest     *soup_session_request_uri      (SoupSession  *session,
+						SoupURI      *uri,
+						GError      **error);
+SOUP_AVAILABLE_IN_2_42
+SoupRequestHTTP *soup_session_request_http     (SoupSession  *session,
+						const char   *method,
+						const char   *uri_string,
+						GError      **error);
+SOUP_AVAILABLE_IN_2_42
+SoupRequestHTTP *soup_session_request_http_uri (SoupSession  *session,
+						const char   *method,
+						SoupURI      *uri,
+						GError      **error);
 
 SOUP_AVAILABLE_IN_2_42
 GQuark soup_request_error_quark (void);
diff --git a/libsoup/soup-types.h b/libsoup/soup-types.h
index 4134b83..0776bdb 100644
--- a/libsoup/soup-types.h
+++ b/libsoup/soup-types.h
@@ -21,6 +21,7 @@ typedef struct _SoupCookieJar         SoupCookieJar;
 typedef struct _SoupDate              SoupDate;
 typedef struct _SoupMessage           SoupMessage;
 typedef struct _SoupRequest           SoupRequest;
+typedef struct _SoupRequestHTTP       SoupRequestHTTP;
 typedef struct _SoupServer            SoupServer;
 typedef struct _SoupSession           SoupSession;
 typedef struct _SoupSessionAsync      SoupSessionAsync;
diff --git a/tests/coding-test.c b/tests/coding-test.c
index 2718353..7723c19 100644
--- a/tests/coding-test.c
+++ b/tests/coding-test.c
@@ -323,7 +323,7 @@ read_finished (GObject *stream, GAsyncResult *result, gpointer user_data)
 }
 
 static GByteArray *
-do_single_coding_req_test (SoupRequest *req,
+do_single_coding_req_test (SoupRequestHTTP *reqh,
 			   const char *expected_encoding,
 			   const char *expected_content_type,
 			   MessageContentStatus status)
@@ -337,9 +337,7 @@ do_single_coding_req_test (SoupRequest *req,
 
 	data = g_byte_array_new ();
 
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-
-	stream = soup_test_request_send (req, NULL, &error);
+	stream = soup_test_request_send (SOUP_REQUEST (reqh), NULL, &error);
 	if (error) {
 		debug_printf (1, "    Error sending request: %s\n",
 			      error->message);
@@ -360,7 +358,7 @@ do_single_coding_req_test (SoupRequest *req,
 			g_byte_array_append (data, buf, nread);
 	} while (nread > 0);
 
-	soup_test_request_close_stream (req, stream, NULL, &error);
+	soup_test_request_close_stream (SOUP_REQUEST (reqh), stream, NULL, &error);
 	if (error) {
 		debug_printf (1, "    error closing stream: %s\n",
 			      error->message);
@@ -369,6 +367,7 @@ do_single_coding_req_test (SoupRequest *req,
 	}
 	g_object_unref (stream);
 
+	msg = soup_request_http_get_message (reqh);
 	check_response (msg, expected_encoding, expected_content_type, status);
 	g_object_unref (msg);
 
@@ -397,8 +396,7 @@ static void
 do_coding_req_test (void)
 {
 	SoupSession *session;
-	SoupRequest *req;
-	SoupMessage *msg;
+	SoupRequestHTTP *reqh;
 	SoupURI *uri;
 	GByteArray *plain, *cmp;
 
@@ -411,38 +409,35 @@ do_coding_req_test (void)
 
 	/* Plain text data, no claim */
 	debug_printf (1, "  GET /mbox, plain\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	plain = do_single_coding_req_test (req, NULL, "text/plain", EXPECT_NOT_DECODED);
-	g_object_unref (req);
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	plain = do_single_coding_req_test (reqh, NULL, "text/plain", EXPECT_NOT_DECODED);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim gzip */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: gzip\n");
 	soup_session_add_feature_by_type (session, SOUP_TYPE_CONTENT_DECODER);
-	req = soup_session_request_uri (session, uri, NULL);
-	cmp = do_single_coding_req_test (req, "gzip", "text/plain", EXPECT_DECODED);
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	cmp = do_single_coding_req_test (reqh, "gzip", "text/plain", EXPECT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "compressed");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim gzip w/ junk */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: gzip, plus trailing junk\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "trailing-junk");
-	cmp = do_single_coding_req_test (req, "gzip", "text/plain", EXPECT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "gzip", "text/plain", EXPECT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "compressed w/ junk");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim gzip with server error */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: gzip, with server error\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "force-encode");
-	cmp = do_single_coding_req_test (req, "gzip", "text/plain", EXPECT_NOT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "gzip", "text/plain", EXPECT_NOT_DECODED);
 
 	/* Failed content-decoding should have left the body untouched
 	 * from what the server sent... which happens to be the
@@ -450,68 +445,57 @@ do_coding_req_test (void)
 	 */
 	check_req_bodies (plain, cmp, "plain", "mis-encoded");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim deflate */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: deflate\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "prefer-deflate-zlib");
-	cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "deflate", "text/plain", EXPECT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "compressed");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim deflate w/ junk */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: deflate, plus trailing junk\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "prefer-deflate-zlib, trailing-junk");
-	cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "deflate", "text/plain", EXPECT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "compressed w/ junk");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim deflate with server error */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: deflate, with server error\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "force-encode, prefer-deflate-zlib");
-	cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_NOT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "deflate", "text/plain", EXPECT_NOT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "mis-encoded");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim deflate (no zlib headers)*/
 	debug_printf (1, "  GET /mbox, Accept-Encoding: deflate (raw data)\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "prefer-deflate-raw");
-	cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "deflate", "text/plain", EXPECT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "compressed");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	/* Plain text data, claim deflate with server error */
 	debug_printf (1, "  GET /mbox, Accept-Encoding: deflate (raw data), with server error\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "force-encode, prefer-deflate-raw");
-	cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_NOT_DECODED);
+	cmp = do_single_coding_req_test (reqh, "deflate", "text/plain", EXPECT_NOT_DECODED);
 	check_req_bodies (plain, cmp, "plain", "mis-encoded");
 	g_byte_array_free (cmp, TRUE);
-	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	g_byte_array_free (plain, TRUE);
 	soup_uri_free (uri);
@@ -525,7 +509,7 @@ do_coding_empty_test (void)
 	SoupSession *session;
 	SoupMessage *msg;
 	SoupURI *uri;
-	SoupRequest *req;
+	SoupRequestHTTP *reqh;
 	GByteArray *body;
 
 	debug_printf (1, "\nEmpty allegedly-encoded body test\n");
@@ -545,14 +529,12 @@ do_coding_empty_test (void)
 	g_object_unref (msg);
 
 	debug_printf (1, "  SoupRequest\n");
-	req = soup_session_request_uri (session, uri, NULL);
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	soup_message_headers_append (msg->request_headers,
+	reqh = soup_session_request_http_uri (session, "GET", uri, NULL);
+	soup_message_headers_append (reqh->request_headers,
 				     "X-Test-Options", "empty");
-	g_object_unref (msg);
-	body = do_single_coding_req_test (req, "gzip", "text/plain", EXPECT_NOT_DECODED);
+	body = do_single_coding_req_test (reqh, "gzip", "text/plain", EXPECT_NOT_DECODED);
 	g_byte_array_free (body, TRUE);
-	g_object_unref (req);
+	g_object_unref (reqh);
 
 	soup_uri_free (uri);
 	soup_test_session_abort_unref (session);
diff --git a/tests/redirect-test.c b/tests/redirect-test.c
index 9adf5d5..f820d00 100644
--- a/tests/redirect-test.c
+++ b/tests/redirect-test.c
@@ -209,7 +209,7 @@ static void
 do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
 {
 	SoupURI *uri;
-	SoupRequest *req;
+	SoupRequestHTTP *reqh;
 	SoupMessage *msg;
 	TestRequest *treq;
 	GInputStream *stream;
@@ -225,9 +225,11 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
 		final_status = tests[n].final_status;
 
 	uri = soup_uri_new_with_base (base_uri, tests[n].requests[0].path);
-	req = soup_session_request_uri (session, uri, &error);
+	reqh = soup_session_request_http_uri (session,
+					      tests[n].requests[0].method,
+					      uri, &error);
 	soup_uri_free (uri);
-	if (!req) {
+	if (!reqh) {
 		debug_printf (1, "    could not create request: %s\n",
 			      error->message);
 		g_error_free (error);
@@ -236,11 +238,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
 		return;
 	}
 
-	msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-	g_object_set (G_OBJECT (msg),
-		      SOUP_MESSAGE_METHOD, tests[n].requests[0].method,
-		      NULL);
-
+	msg = soup_request_http_get_message (reqh);
 	if (msg->method == SOUP_METHOD_POST) {
 		soup_message_set_request (msg, "text/plain",
 					  SOUP_MEMORY_STATIC,
@@ -254,7 +252,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
 	g_signal_connect (msg, "restarted",
 			  G_CALLBACK (restarted), &treq);
 
-	stream = soup_test_request_send (req, NULL, &error);
+	stream = soup_test_request_send (SOUP_REQUEST (reqh), NULL, &error);
 
 	if (SOUP_STATUS_IS_TRANSPORT_ERROR (final_status)) {
 		if (stream) {
@@ -272,22 +270,20 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
 		}
 
 		g_error_free (error);
-		g_object_unref (msg);
-		g_object_unref (req);
+		g_object_unref (reqh);
 		debug_printf (2, "\n");
 		return;
 	} else if (!stream) {
 		debug_printf (1, "    could not send request: %s\n",
 			      error->message);
 		g_error_free (error);
-		g_object_unref (msg);
-		g_object_unref (req);
+		g_object_unref (reqh);
 		errors++;
 		debug_printf (2, "\n");
 		return;
 	}
 
-	soup_test_request_close_stream (req, stream, NULL, &error);
+	soup_test_request_close_stream (SOUP_REQUEST (reqh), stream, NULL, &error);
 	if (error) {
 		debug_printf (1, "    could not close stream: %s\n",
 			      error->message);
@@ -303,7 +299,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
 	}
 
 	g_object_unref (msg);
-	g_object_unref (req);
+	g_object_unref (reqh);
 	debug_printf (2, "\n");
 }
 



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