SoupRequestHTTP: mirror SoupMessage fields/API
authorDan Winship <danw@gnome.org>
Sun, 15 Jul 2012 22:21:37 +0000 (18:21 -0400)
committerDan Winship <danw@gnome.org>
Mon, 10 Dec 2012 16:14:57 +0000 (17:14 +0100)
Mirror various SoupMessage-related API onto SoupRequestHTTP so that
you don't need to resort to soup_request_http_get_message().

docs/reference/libsoup-2.4-sections.txt
libsoup/libsoup-2.4.sym
libsoup/soup-request-http.c
libsoup/soup-request-http.h
libsoup/soup-request.c
tests/connection-test.c
tests/proxy-test.c
tests/requester-test.c

index 237d3f0..b46c9f9 100644 (file)
@@ -1162,6 +1162,14 @@ soup_request_file_get_type
 <FILE>soup-request-http</FILE>
 <TITLE>SoupRequestHTTP</TITLE>
 SoupRequestHTTP
+soup_request_http_set_method
+soup_request_http_set_request_version
+soup_request_http_set_flags
+soup_request_http_get_flags
+soup_request_http_set_first_party
+soup_request_http_get_first_party
+soup_request_http_get_https_status
+<SUBSECTION>
 soup_request_http_get_message
 <SUBSECTION Standard>
 SOUP_IS_REQUEST_HTTP
index 24dcc17..9a1c7df 100644 (file)
@@ -325,8 +325,15 @@ soup_request_get_content_type
 soup_request_get_session
 soup_request_get_type
 soup_request_get_uri
+soup_request_http_get_first_party
+soup_request_http_get_flags
+soup_request_http_get_https_status
 soup_request_http_get_message
 soup_request_http_get_type
+soup_request_http_set_first_party
+soup_request_http_set_flags
+soup_request_http_set_method
+soup_request_http_set_request_version
 soup_request_send
 soup_request_send_async
 soup_request_send_finish
index 96ba251..01c37e3 100644 (file)
 
 G_DEFINE_TYPE (SoupRequestHTTP, soup_request_http, SOUP_TYPE_REQUEST)
 
+enum {
+       PROP_0,
+
+       PROP_METHOD,
+       PROP_REQUEST_URI,
+       PROP_REQUEST_VERSION,
+       PROP_REQUEST_HEADERS,
+       PROP_STATUS_CODE,
+       PROP_REASON_PHRASE,
+       PROP_RESPONSE_VERSION,
+       PROP_RESPONSE_HEADERS,
+
+       PROP_FLAGS,
+       PROP_FIRST_PARTY,
+       PROP_TLS_CERTIFICATE,
+       PROP_TLS_ERRORS,
+
+       LAST_PROP
+};
+
 struct _SoupRequestHTTPPrivate {
        SoupMessage *msg;
        char *content_type;
+       gboolean sent;
 };
 
 static void content_sniffed (SoupMessage *msg,
@@ -50,6 +71,125 @@ soup_request_http_init (SoupRequestHTTP *http)
        http->priv = G_TYPE_INSTANCE_GET_PRIVATE (http, SOUP_TYPE_REQUEST_HTTP, SoupRequestHTTPPrivate);
 }
 
+static void
+soup_request_http_set_property (GObject *object, guint prop_id,
+                               const GValue *value, GParamSpec *pspec)
+{
+       SoupRequestHTTP *http = SOUP_REQUEST_HTTP (object);
+
+       switch (prop_id) {
+       case PROP_METHOD:
+               soup_request_http_set_method (http, g_value_get_string (value));
+               break;
+       case PROP_REQUEST_VERSION:
+               soup_request_http_set_request_version (http, g_value_get_enum (value));
+               break;
+       case PROP_FLAGS:
+               soup_request_http_set_flags (http, g_value_get_flags (value));
+               break;
+       case PROP_FIRST_PARTY:
+               soup_request_http_set_first_party (http, g_value_get_boxed (value));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+soup_request_http_get_property (GObject *object, guint prop_id,
+                               GValue *value, GParamSpec *pspec)
+{
+       SoupRequestHTTP *http = SOUP_REQUEST_HTTP (object);
+       GTlsCertificate *cert;
+       GTlsCertificateFlags errors;
+
+       switch (prop_id) {
+       case PROP_METHOD:
+               g_value_set_string (value, http->method);
+               break;
+       case PROP_REQUEST_URI:
+               g_value_set_boxed (value, http->request_uri);
+               break;
+       case PROP_REQUEST_VERSION:
+               g_value_set_enum (value, http->request_version);
+               break;
+       case PROP_REQUEST_HEADERS:
+               g_value_set_boxed (value, http->request_headers);
+               break;
+       case PROP_STATUS_CODE:
+               g_value_set_uint (value, http->status_code);
+               break;
+       case PROP_REASON_PHRASE:
+               g_value_set_string (value, http->reason_phrase);
+               break;
+       case PROP_RESPONSE_VERSION:
+               g_value_set_enum (value, http->response_version);
+               break;
+       case PROP_RESPONSE_HEADERS:
+               g_value_set_boxed (value, http->request_headers);
+               break;
+       case PROP_FLAGS:
+               g_value_set_flags (value, soup_message_get_flags (http->priv->msg));
+               break;
+       case PROP_FIRST_PARTY:
+               g_value_set_boxed (value, soup_message_get_first_party (http->priv->msg));
+               break;
+       case PROP_TLS_CERTIFICATE:
+               g_object_get (G_OBJECT (http->priv->msg),
+                             "tls-certificate", &cert,
+                             NULL);
+               g_value_set_object (value, cert);
+               break;
+       case PROP_TLS_ERRORS:
+               g_object_get (G_OBJECT (http->priv->msg),
+                             "tls-errors", &errors,
+                             NULL);
+               g_value_set_flags (value, errors);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+message_property_changed (GObject    *object,
+                         GParamSpec *pspec,
+                         gpointer    user_data)
+{
+       SoupRequestHTTP *http = user_data;
+
+       if (!strcmp (pspec->name, "method")) {
+               http->method = http->priv->msg->method;
+               g_object_notify (G_OBJECT (http), "method");
+       } else if (!strcmp (pspec->name, "uri")) {
+               http->request_uri = soup_message_get_uri (http->priv->msg);
+               g_object_notify (G_OBJECT (http), "request-uri");
+       } else if (!strcmp (pspec->name, "status-code")) {
+               http->status_code = http->priv->msg->status_code;
+               g_object_notify (G_OBJECT (http), "status-code");
+       } else if (!strcmp (pspec->name, "reason-phrase")) {
+               http->reason_phrase = http->priv->msg->reason_phrase;
+               g_object_notify (G_OBJECT (http), "reason-phrase");
+       } else if (!strcmp (pspec->name, "http-version")) {
+               if (!http->priv->sent) {
+                       http->request_version = soup_message_get_http_version (http->priv->msg);
+                       g_object_notify (G_OBJECT (http), "request-version");
+               } else {
+                       http->response_version = soup_message_get_http_version (http->priv->msg);
+                       g_object_notify (G_OBJECT (http), "response-version");
+               }
+       } else if (!strcmp (pspec->name, "flags"))
+               g_object_notify (G_OBJECT (http), "flags");
+       else if (!strcmp (pspec->name, "first-party"))
+               g_object_notify (G_OBJECT (http), "first-party");
+       else if (!strcmp (pspec->name, "tls-certificate"))
+               g_object_notify (G_OBJECT (http), "tls-certificate");
+       else if (!strcmp (pspec->name, "tls-errors"))
+               g_object_notify (G_OBJECT (http), "tls-errors");
+}
+
 static gboolean
 soup_request_http_check_uri (SoupRequest  *request,
                             SoupURI      *uri,
@@ -63,6 +203,17 @@ soup_request_http_check_uri (SoupRequest  *request,
        http->priv->msg = soup_message_new_from_uri (SOUP_METHOD_GET, uri);
        g_signal_connect (http->priv->msg, "content-sniffed",
                          G_CALLBACK (content_sniffed), http);
+
+       g_signal_connect (http->priv->msg, "notify",
+                         G_CALLBACK (message_property_changed), http);
+
+       http->method = http->priv->msg->method;
+       http->request_uri = soup_message_get_uri (http->priv->msg);
+       http->request_version = SOUP_HTTP_1_1;
+       http->request_headers = http->priv->msg->request_headers;
+       http->response_version = SOUP_HTTP_1_1;
+       http->response_headers = http->priv->msg->response_headers;
+
        return TRUE;
 }
 
@@ -75,6 +226,9 @@ soup_request_http_finalize (GObject *object)
                g_signal_handlers_disconnect_by_func (http->priv->msg,
                                                      G_CALLBACK (content_sniffed),
                                                      http);
+               g_signal_handlers_disconnect_by_func (http->priv->msg,
+                                                     G_CALLBACK (message_property_changed),
+                                                     http);
                g_object_unref (http->priv->msg);
        }
 
@@ -93,6 +247,7 @@ soup_request_http_send (SoupRequest          *request,
 
        g_return_val_if_fail (!SOUP_IS_SESSION_ASYNC (session), NULL);
 
+       http->priv->sent = TRUE;
        return soup_session_send_request (session, http->priv->msg,
                                          cancellable, error);
 }
@@ -195,6 +350,8 @@ soup_request_http_send_async (SoupRequest          *request,
 
        g_return_if_fail (!SOUP_IS_SESSION_SYNC (session));
 
+       http->priv->sent = TRUE;
+
        task = g_task_new (request, cancellable, callback, user_data);
        sadata = g_slice_new0 (SendAsyncData);
        g_task_set_task_data (task, sadata, (GDestroyNotify)free_send_async_data);
@@ -303,6 +460,8 @@ soup_request_http_class_init (SoupRequestHTTPClass *request_http_class)
 
        request_class->schemes = http_schemes;
 
+       object_class->set_property = soup_request_http_set_property;
+       object_class->get_property = soup_request_http_get_property;
        object_class->finalize = soup_request_http_finalize;
 
        request_class->check_uri = soup_request_http_check_uri;
@@ -311,6 +470,199 @@ soup_request_http_class_init (SoupRequestHTTPClass *request_http_class)
        request_class->send_finish = soup_request_http_send_finish;
        request_class->get_content_length = soup_request_http_get_content_length;
        request_class->get_content_type = soup_request_http_get_content_type;
+
+       /**
+        * SoupRequestHTTP:method:
+        *
+        * The request's HTTP method; "GET" by default. Note that in
+        * C you can simply read the <literal>method</literal> field
+        * of the #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_METHOD,
+               g_param_spec_string ("method",
+                                    "Method",
+                                    "The HTTP method",
+                                    SOUP_METHOD_GET,
+                                    G_PARAM_READWRITE));
+       /**
+        * SoupRequestHTTP:request-uri:
+        *
+        * The request's #SoupURI. Note that in C you can simply read
+        * the <literal>request_uri</literal> field of the
+        * #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_REQUEST_URI,
+               g_param_spec_boxed ("request-uri",
+                                   "URI",
+                                   "The Request-URI",
+                                   SOUP_TYPE_URI,
+                                   G_PARAM_READWRITE));
+       /**
+        * SoupRequestHTTP:request-version:
+        *
+        * The #SoupHTTPVersion used when sending the request;
+        * %SOUP_HTTP_1_1 by default. Note that in C you can simply
+        * read the <literal>request_version</literal> field of the
+        * #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_REQUEST_VERSION,
+               g_param_spec_enum ("request-version",
+                                  "Request HTTP Version",
+                                  "The SoupHTTPVersion used when sending the request",
+                                  SOUP_TYPE_HTTP_VERSION,
+                                  SOUP_HTTP_1_1,
+                                  G_PARAM_READWRITE));
+       /**
+        * SoupRequestHTTP:request-headers:
+        *
+        * The request's HTTP request headers. Note that in C you can
+        * simply read the <literal>request_headers</literal> field of
+        * the #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_REQUEST_HEADERS,
+               g_param_spec_boxed ("request-headers",
+                                   "Request Headers",
+                                   "The HTTP request headers",
+                                   SOUP_TYPE_MESSAGE_HEADERS,
+                                   G_PARAM_READABLE));
+
+       /**
+        * SoupRequestHTTP:status-code:
+        *
+        * The request's HTTP response status code. Note that in C you
+        * can simply read the <literal>status_code</literal> field of
+        * the #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_STATUS_CODE,
+               g_param_spec_uint ("status-code",
+                                  "Status code",
+                                  "The HTTP response status code",
+                                  0, 599, 0,
+                                  G_PARAM_READABLE));
+       /**
+        * SoupRequestHTTP:reason-phrase:
+        *
+        * The request's HTTP response reason phrase. Note that in C
+        * you can simply read the <literal>reason_phrase</literal>
+        * field of the #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_REASON_PHRASE,
+               g_param_spec_string ("reason-phrase",
+                                    "Reason phrase",
+                                    "The HTTP response reason phrase",
+                                    NULL,
+                                    G_PARAM_READABLE));
+       /**
+        * SoupRequestHTTP:response-version:
+        *
+        * The #SoupHTTPVersion that the server replied with. Note
+        * that in C you can simply read the
+        * <literal>response_version</literal> field of the
+        * #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_RESPONSE_VERSION,
+               g_param_spec_enum ("response-version",
+                                  "Response HTTP Version",
+                                  "The SoupHTTPVersion that the server replied with",
+                                  SOUP_TYPE_HTTP_VERSION,
+                                  SOUP_HTTP_1_1,
+                                  G_PARAM_READABLE));
+       /**
+        * SoupRequestHTTP:response-headers:
+        *
+        * The request's HTTP response headers. Note that in C you can
+        * simply read the <literal>response_headers</literal> field
+        * of the #SoupRequestHTTP.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_RESPONSE_HEADERS,
+               g_param_spec_boxed ("response-headers",
+                                   "Response Headers",
+                                   "The HTTP response headers",
+                                   SOUP_TYPE_MESSAGE_HEADERS,
+                                   G_PARAM_READABLE));
+
+       /**
+        * SoupRequestHTTP:flags:
+        *
+        * The request's #SoupMessageFlags.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_FLAGS,
+               g_param_spec_flags ("flags",
+                                   "Flags",
+                                   "Various request options",
+                                   SOUP_TYPE_MESSAGE_FLAGS,
+                                   0,
+                                   G_PARAM_READWRITE));
+       /**
+        * SoupRequestHTTP:first-party:
+        *
+        * The #SoupURI loaded in the application when the request was
+        * queued.
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_FIRST_PARTY,
+               g_param_spec_boxed ("first-party",
+                                   "First party",
+                                   "The URI loaded in the application when the request was queued.",
+                                   SOUP_TYPE_URI,
+                                   G_PARAM_READWRITE));
+       /**
+        * SoupRequestHTTP:tls-certificate:
+        *
+        * The #GTlsCertificate associated with the request
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_TLS_CERTIFICATE,
+               g_param_spec_object ("tls-certificate",
+                                    "TLS Certificate",
+                                    "The TLS certificate associated with the request",
+                                    G_TYPE_TLS_CERTIFICATE,
+                                    G_PARAM_READABLE));
+       /**
+        * SoupRequestHTTP:tls-errors:
+        *
+        * The verification errors on #SoupRequestHTTP:tls-certificate
+        *
+        * Since: 2.42
+        */
+       g_object_class_install_property (
+               object_class, PROP_TLS_ERRORS,
+               g_param_spec_flags ("tls-errors",
+                                   "TLS Errors",
+                                   "The verification errors on the request's TLS certificate",
+                                   G_TYPE_TLS_CERTIFICATE_FLAGS, 0,
+                                   G_PARAM_READABLE));
 }
 
 /**
@@ -321,7 +673,7 @@ soup_request_http_class_init (SoupRequestHTTPClass *request_http_class)
  *
  * Returns: (transfer full): a new reference to the #SoupMessage
  *
- * Since: 2.40
+ * Since: 2.42
  */
 SoupMessage *
 soup_request_http_get_message (SoupRequestHTTP *http)
@@ -330,3 +682,127 @@ soup_request_http_get_message (SoupRequestHTTP *http)
 
        return g_object_ref (http->priv->msg);
 }
+
+void
+soup_request_http_set_method (SoupRequestHTTP *http,
+                             const char      *method)
+{
+       g_object_set (G_OBJECT (http->priv->msg),
+                     "method", method,
+                     NULL);
+}
+
+/**
+ * soup_request_http_set_request_version:
+ * @http: a #SoupRequestHTTP
+ * @version: the version of HTTP to use
+ *
+ * Sets @http to use the version of HTTP specified by @version in its
+ * request.
+ *
+ * Since: 2.42
+ */
+void
+soup_request_http_set_request_version (SoupRequestHTTP *http,
+                                      SoupHTTPVersion  version)
+{
+       g_return_if_fail (!http->priv->sent);
+
+       g_object_set (G_OBJECT (http->priv->msg),
+                     "http-version", version,
+                     NULL);
+}
+
+/**
+ * soup_request_http_get_first_party:
+ * @http: a #SoupRequestHTTP
+ *
+ * Gets @http's first-party #SoupURI; see the documentation
+ * for #SoupCookieJarAcceptPolicy for more details.
+ *
+ * Returns: (transfer none): @http's first-party URI
+ *
+ * Since: 2.42
+ */
+SoupURI *
+soup_request_http_get_first_party (SoupRequestHTTP *http)
+{
+       return soup_message_get_first_party (http->priv->msg);
+}
+
+/**
+ * soup_request_http_set_first_party:
+ * @http: a #SoupRequestHTTP
+ * @first_party: the #SoupURI for the request's first party
+ *
+ * Sets @first_party as the main document #SoupURI for @http. For
+ * details of when and how this is used refer to the documentation for
+ * #SoupCookieJarAcceptPolicy.
+ *
+ * Since: 2.42
+ */
+void
+soup_request_http_set_first_party (SoupRequestHTTP *http,
+                                  SoupURI         *first_party)
+{
+       soup_message_set_first_party (http->priv->msg,
+                                     first_party);
+}
+
+/**
+ * soup_request_http_get_flags:
+ * @http: a #SoupRequestHTTP
+ *
+ * Gets @http's message flags.
+ *
+ * Returns: @http's message flags
+ *
+ * Since: 2.42
+ */
+SoupMessageFlags
+soup_request_http_get_flags (SoupRequestHTTP *http)
+{
+       return soup_message_get_flags (http->priv->msg);
+}
+
+/**
+ * soup_request_http_set_flags:
+ * @http: a #SoupRequestHTTP
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Sets the specified flags on @msg. Note that some #SoupMessageFlags
+ * (such as %SOUP_MESSAGE_CAN_REBUILD and
+ * %SOUP_MESSAGE_OVERWRITE_CHUNKS) have no effect in the #SoupRequest
+ * API.
+ *
+ * Since: 2.42
+ */
+void
+soup_request_http_set_flags (SoupRequestHTTP  *http,
+                            SoupMessageFlags  flags)
+{
+       soup_message_set_flags (http->priv->msg, flags);
+}
+
+/**
+ * soup_request_http_get_https_status:
+ * @http: a #SoupRequestHTTP
+ * @certificate: (out) (transfer none): @http's TLS certificate
+ * @errors: (out): the verification status of @certificate
+ *
+ * If @http is using https, this retrieves the #GTlsCertificate
+ * associated with its connection, and the #GTlsCertificateFlags showing
+ * what problems, if any, have been found with that certificate.
+ *
+ * Return value: %TRUE if @http uses https, %FALSE if not
+ *
+ * Since: 2.42
+ */
+gboolean
+soup_request_http_get_https_status (SoupRequestHTTP       *http,
+                                   GTlsCertificate      **certificate,
+                                   GTlsCertificateFlags  *errors)
+{
+       return soup_message_get_https_status (http->priv->msg,
+                                             certificate, errors);
+}
index bad4345..58fbbfd 100644 (file)
@@ -23,6 +23,8 @@
 #define SOUP_REQUEST_HTTP_H 1
 
 #include "soup-request.h"
+#include "soup-message.h"
+#include "soup-message-headers.h"
 
 G_BEGIN_DECLS
 
@@ -38,7 +40,20 @@ typedef struct _SoupRequestHTTPPrivate SoupRequestHTTPPrivate;
 typedef struct {
        SoupRequest parent;
 
+       /*< public >*/
+       const char         *method;
+       SoupURI            *request_uri;
+       SoupHTTPVersion     request_version;
+       SoupMessageHeaders *request_headers;
+
+       guint               status_code;
+       char               *reason_phrase;
+       SoupHTTPVersion     response_version;
+       SoupMessageHeaders *response_headers;
+
+       /*< private >*/
        SoupRequestHTTPPrivate *priv;
+
 } SoupRequestHTTP;
 
 typedef struct {
@@ -49,7 +64,31 @@ SOUP_AVAILABLE_IN_2_34
 GType soup_request_http_get_type (void);
 
 SOUP_AVAILABLE_IN_2_34
-SoupMessage *soup_request_http_get_message (SoupRequestHTTP *http);
+SoupMessage      *soup_request_http_get_message         (SoupRequestHTTP      *http);
+
+SOUP_AVAILABLE_IN_2_42
+void              soup_request_http_set_method          (SoupRequestHTTP      *http,
+                                                        const char           *method);
+SOUP_AVAILABLE_IN_2_42
+void              soup_request_http_set_request_version (SoupRequestHTTP      *http,
+                                                        SoupHTTPVersion       version);
+
+SOUP_AVAILABLE_IN_2_42
+SoupURI          *soup_request_http_get_first_party     (SoupRequestHTTP      *http);
+SOUP_AVAILABLE_IN_2_42
+void              soup_request_http_set_first_party     (SoupRequestHTTP      *http,
+                                                        SoupURI              *first_party);
+
+SOUP_AVAILABLE_IN_2_42
+SoupMessageFlags  soup_request_http_get_flags           (SoupRequestHTTP      *http);
+SOUP_AVAILABLE_IN_2_42
+void              soup_request_http_set_flags           (SoupRequestHTTP      *http,
+                                                        SoupMessageFlags      flags);
+
+SOUP_AVAILABLE_IN_2_42
+gboolean          soup_request_http_get_https_status    (SoupRequestHTTP       *http,
+                                                        GTlsCertificate      **certificate,
+                                                        GTlsCertificateFlags  *errors);
 
 G_END_DECLS
 
index 006a253..e19547b 100644 (file)
@@ -30,6 +30,7 @@
 #include "soup-request.h"
 #include "soup.h"
 #include "soup-requester.h"
+#include "soup-request-http.h"
 
 /**
  * SECTION:soup-request
index 6b57f24..938c7de 100644 (file)
@@ -300,7 +300,7 @@ static void
 do_timeout_req_test_for_session (SoupSession *session)
 {
        SoupRequest *req;
-       SoupMessage *msg;
+       SoupRequestHTTP *http;
        GInputStream *stream;
        SoupSocket *sockets[4] = { NULL, NULL, NULL, NULL };
        SoupURI *timeout_uri;
@@ -360,10 +360,10 @@ do_timeout_req_test_for_session (SoupSession *session)
                g_object_unref (stream);
        }
 
-       msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
-       if (msg->status_code != SOUP_STATUS_OK) {
+       http = SOUP_REQUEST_HTTP (req);
+       if (http->status_code != SOUP_STATUS_OK) {
                debug_printf (1, "      Unexpected response: %d %s\n",
-                             msg->status_code, msg->reason_phrase);
+                             http->status_code, http->reason_phrase);
                errors++;
        }
        if (sockets[1] != sockets[0]) {
@@ -379,7 +379,6 @@ do_timeout_req_test_for_session (SoupSession *session)
                debug_printf (1, "      Message was retried again??\n");
                errors++;
        }
-       g_object_unref (msg);
        g_object_unref (req);
 
        for (i = 0; sockets[i]; i++)
index 048acfa..3466c56 100644 (file)
@@ -131,8 +131,8 @@ test_url_new_api (const char *url, int proxy, guint expected,
 {
        SoupSession *session;
        SoupURI *proxy_uri;
-       SoupMessage *msg;
        SoupRequest *request;
+       SoupRequestHTTP *http;
        GInputStream *stream;
        GError *error = NULL;
 
@@ -162,7 +162,6 @@ test_url_new_api (const char *url, int proxy, guint expected,
        }
 
        request = soup_session_request (session, url, NULL);
-       msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
 
        stream = soup_test_request_send (request, NULL, &error);
        if (!stream) {
@@ -183,13 +182,13 @@ test_url_new_api (const char *url, int proxy, guint expected,
                g_object_unref (stream);
        }
 
-       debug_printf (1, "  %d %s\n", msg->status_code, msg->reason_phrase);
-       if (msg->status_code != expected) {
+       http = SOUP_REQUEST_HTTP (request);
+       debug_printf (1, "  %d %s\n", http->status_code, http->reason_phrase);
+       if (http->status_code != expected) {
                debug_printf (1, "  EXPECTED %d!\n", expected);
                errors++;
        }
 
-       g_object_unref (msg);
        g_object_unref (request);
 
        soup_test_session_abort_unref (session);
index 660669a..4a27678 100644 (file)
@@ -142,10 +142,10 @@ test_read_ready (GObject *source, GAsyncResult *res, gpointer user_data)
 static void
 auth_test_sent (GObject *source, GAsyncResult *res, gpointer user_data)
 {
+       SoupRequestHTTP *http = SOUP_REQUEST_HTTP (source);
        RequestData *data = user_data;
        GInputStream *stream;
        GError *error = NULL;
-       SoupMessage *msg;
        const char *content_type;
 
        stream = soup_request_send_finish (SOUP_REQUEST (source), res, &error);
@@ -157,15 +157,14 @@ auth_test_sent (GObject *source, GAsyncResult *res, gpointer user_data)
                return;
        }
 
-       msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (source));
-       if (msg->status_code != SOUP_STATUS_UNAUTHORIZED) {
-               debug_printf (1, "    GET failed: %d %s\n", msg->status_code,
-                             msg->reason_phrase);
+
+       if (http->status_code != SOUP_STATUS_UNAUTHORIZED) {
+               debug_printf (1, "    GET failed: %d %s\n", http->status_code,
+                             http->reason_phrase);
                errors++;
                g_main_loop_quit (loop);
                return;
        }
-       g_object_unref (msg);
 
        content_type = soup_request_get_content_type (SOUP_REQUEST (source));
        if (g_strcmp0 (content_type, "text/html") != 0) {
@@ -263,11 +262,12 @@ do_async_test (SoupSession *session, SoupURI *uri,
                request = soup_requester_request_uri (requester, uri, NULL);
        else
                request = soup_session_request_uri (session, uri, NULL);
-       msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
 
        if (cancel) {
+               msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
                g_signal_connect (msg, "got-headers",
                                  G_CALLBACK (cancel_message), session);
+               g_object_unref (msg);
        }
 
        started_id = g_signal_connect (session, "request-started",
@@ -275,7 +275,6 @@ do_async_test (SoupSession *session, SoupURI *uri,
                                       &socket);
 
        soup_request_send_async (request, NULL, callback, &data);
-       g_object_unref (request);
 
        loop = g_main_loop_new (soup_session_get_async_context (session), TRUE);
        g_main_loop_run (loop);
@@ -283,16 +282,16 @@ do_async_test (SoupSession *session, SoupURI *uri,
 
        g_signal_handler_disconnect (session, started_id);
 
-       if (msg->status_code != expected_status) {
+       if (SOUP_REQUEST_HTTP (request)->status_code != expected_status) {
                debug_printf (1, "    GET failed: %d %s (expected %d)\n",
                              msg->status_code, msg->reason_phrase,
                              expected_status);
-               g_object_unref (msg);
                g_object_unref (socket);
+               g_object_unref (request);
                errors++;
                return;
        }
-       g_object_unref (msg);
+       g_object_unref (request);
 
        if (!expected_response) {
                if (data.body->len) {
@@ -468,10 +467,11 @@ do_sync_request (SoupSession *session, SoupRequest *request,
        guint started_id;
        SoupSocket *socket = NULL;
 
-       msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
        if (cancel) {
+               msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
                g_signal_connect (msg, "got-headers",
                                  G_CALLBACK (cancel_message), session);
+               g_object_unref (msg);
        }
 
        started_id = g_signal_connect (session, "request-started",
@@ -491,29 +491,25 @@ do_sync_request (SoupSession *session, SoupRequest *request,
                        errors++;
                }
                g_clear_error (&error);
-               g_object_unref (msg);
                g_object_unref (socket);
                return;
        } else if (!in) {
                debug_printf (1, "    soup_request_send failed: %s\n",
                              error->message);
-               g_object_unref (msg);
                g_clear_error (&error);
                g_object_unref (socket);
                errors++;
                return;
        }
 
-       if (msg->status_code != expected_status) {
+       if (SOUP_REQUEST_HTTP (request)->status_code != expected_status) {
                debug_printf (1, "    GET failed: %d %s\n", msg->status_code,
                              msg->reason_phrase);
-               g_object_unref (msg);
                g_object_unref (in);
                g_object_unref (socket);
                errors++;
                return;
        }
-       g_object_unref (msg);
 
        body = g_string_new (NULL);
        do {