Blame libsoup/soup-request.c

rpm-build 4f3c61
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
rpm-build 4f3c61
/*
rpm-build 4f3c61
 * soup-request.c: Protocol-independent streaming request interface
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Copyright (C) 2009, 2010 Red Hat, Inc.
rpm-build 4f3c61
 * Copyright (C) 2010, Igalia S.L.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * This library is free software; you can redistribute it and/or
rpm-build 4f3c61
 * modify it under the terms of the GNU Library General Public
rpm-build 4f3c61
 * License as published by the Free Software Foundation; either
rpm-build 4f3c61
 * version 2 of the License, or (at your option) any later version.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * This library is distributed in the hope that it will be useful,
rpm-build 4f3c61
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rpm-build 4f3c61
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
rpm-build 4f3c61
 * Library General Public License for more details.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * You should have received a copy of the GNU Library General Public License
rpm-build 4f3c61
 * along with this library; see the file COPYING.LIB.  If not, write to
rpm-build 4f3c61
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
rpm-build 4f3c61
 * Boston, MA 02110-1301, USA.
rpm-build 4f3c61
 */
rpm-build 4f3c61
rpm-build 4f3c61
#ifdef HAVE_CONFIG_H
rpm-build 4f3c61
#include <config.h>
rpm-build 4f3c61
#endif
rpm-build 4f3c61
rpm-build 4f3c61
#include <glib/gi18n-lib.h>
rpm-build 4f3c61
rpm-build 4f3c61
#include "soup-request.h"
rpm-build 4f3c61
#include "soup.h"
rpm-build 4f3c61
#include "soup-requester.h"
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * SECTION:soup-request
rpm-build 4f3c61
 * @short_description: Protocol-independent streaming request interface
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * A #SoupRequest is created by #SoupSession, and represents a request
rpm-build 4f3c61
 * to retrieve a particular URI.
rpm-build 4f3c61
 */
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * SoupRequest:
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * A request to retrieve a particular URI.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
rpm-build 4f3c61
enum {
rpm-build 4f3c61
	PROP_0,
rpm-build 4f3c61
	PROP_URI,
rpm-build 4f3c61
	PROP_SESSION
rpm-build 4f3c61
};
rpm-build 4f3c61
rpm-build 4f3c61
struct _SoupRequestPrivate {
rpm-build 4f3c61
	SoupURI *uri;
rpm-build 4f3c61
	SoupSession *session;
rpm-build 4f3c61
};
rpm-build 4f3c61
rpm-build 4f3c61
static void soup_request_initable_interface_init (GInitableIface *initable_interface);
rpm-build 4f3c61
rpm-build 4f3c61
G_DEFINE_TYPE_WITH_CODE (SoupRequest, soup_request, G_TYPE_OBJECT,
rpm-build 4f3c61
                         G_ADD_PRIVATE (SoupRequest)
rpm-build 4f3c61
			 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
rpm-build 4f3c61
						soup_request_initable_interface_init))
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_init (SoupRequest *request)
rpm-build 4f3c61
{
rpm-build 4f3c61
	request->priv = soup_request_get_instance_private (request);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_finalize (GObject *object)
rpm-build 4f3c61
{
rpm-build 4f3c61
	SoupRequest *request = SOUP_REQUEST (object);
rpm-build 4f3c61
rpm-build 4f3c61
	g_clear_pointer (&request->priv->uri, soup_uri_free);
rpm-build 4f3c61
	g_clear_object (&request->priv->session);
rpm-build 4f3c61
rpm-build 4f3c61
	G_OBJECT_CLASS (soup_request_parent_class)->finalize (object);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_set_property (GObject      *object,
rpm-build 4f3c61
			   guint prop_id,
rpm-build 4f3c61
			   const GValue *value,
rpm-build 4f3c61
			   GParamSpec   *pspec)
rpm-build 4f3c61
{
rpm-build 4f3c61
	SoupRequest *request = SOUP_REQUEST (object);
rpm-build 4f3c61
rpm-build 4f3c61
	switch (prop_id) {
rpm-build 4f3c61
	case PROP_URI:
rpm-build 4f3c61
		if (request->priv->uri)
rpm-build 4f3c61
			soup_uri_free (request->priv->uri);
rpm-build 4f3c61
		request->priv->uri = g_value_dup_boxed (value);
rpm-build 4f3c61
		break;
rpm-build 4f3c61
	case PROP_SESSION:
rpm-build 4f3c61
		if (request->priv->session)
rpm-build 4f3c61
			g_object_unref (request->priv->session);
rpm-build 4f3c61
		request->priv->session = g_value_dup_object (value);
rpm-build 4f3c61
		break;
rpm-build 4f3c61
	default:
rpm-build 4f3c61
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
rpm-build 4f3c61
		break;
rpm-build 4f3c61
	}
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_get_property (GObject    *object,
rpm-build 4f3c61
			   guint prop_id,
rpm-build 4f3c61
			   GValue     *value,
rpm-build 4f3c61
			   GParamSpec *pspec)
rpm-build 4f3c61
{
rpm-build 4f3c61
	SoupRequest *request = SOUP_REQUEST (object);
rpm-build 4f3c61
rpm-build 4f3c61
	switch (prop_id) {
rpm-build 4f3c61
	case PROP_URI:
rpm-build 4f3c61
		g_value_set_boxed (value, request->priv->uri);
rpm-build 4f3c61
		break;
rpm-build 4f3c61
	case PROP_SESSION:
rpm-build 4f3c61
		g_value_set_object (value, request->priv->session);
rpm-build 4f3c61
		break;
rpm-build 4f3c61
	default:
rpm-build 4f3c61
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
rpm-build 4f3c61
		break;
rpm-build 4f3c61
	}
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static gboolean
rpm-build 4f3c61
soup_request_initable_init (GInitable     *initable,
rpm-build 4f3c61
			    GCancellable  *cancellable,
rpm-build 4f3c61
			    GError       **error)
rpm-build 4f3c61
{
rpm-build 4f3c61
	SoupRequest *request = SOUP_REQUEST (initable);
rpm-build 4f3c61
	gboolean ok;
rpm-build 4f3c61
rpm-build 4f3c61
	if (!request->priv->uri) {
rpm-build 4f3c61
		g_set_error (error, SOUP_REQUEST_ERROR, SOUP_REQUEST_ERROR_BAD_URI,
rpm-build 4f3c61
			     _("No URI provided"));
rpm-build 4f3c61
		return FALSE;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	ok = SOUP_REQUEST_GET_CLASS (initable)->
rpm-build 4f3c61
		check_uri (request, request->priv->uri, error);
rpm-build 4f3c61
rpm-build 4f3c61
	if (!ok && error && !*error) {
rpm-build 4f3c61
		char *uri_string = soup_uri_to_string (request->priv->uri, FALSE);
rpm-build 4f3c61
		g_set_error (error, SOUP_REQUEST_ERROR, SOUP_REQUEST_ERROR_BAD_URI,
rpm-build 4f3c61
			     _("Invalid ā€œ%sā€ URI: %s"),
rpm-build 4f3c61
			     request->priv->uri->scheme,
rpm-build 4f3c61
			     uri_string);
rpm-build 4f3c61
		g_free (uri_string);
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	return ok;
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static gboolean
rpm-build 4f3c61
soup_request_default_check_uri (SoupRequest  *request,
rpm-build 4f3c61
				SoupURI      *uri,
rpm-build 4f3c61
				GError      **error)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return TRUE;
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/* Default implementation: assume the sync implementation doesn't block */
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_default_send_async (SoupRequest          *request,
rpm-build 4f3c61
				 GCancellable         *cancellable,
rpm-build 4f3c61
				 GAsyncReadyCallback   callback,
rpm-build 4f3c61
				 gpointer              user_data)
rpm-build 4f3c61
{
rpm-build 4f3c61
	GTask *task;
rpm-build 4f3c61
	GInputStream *stream;
rpm-build 4f3c61
	GError *error = NULL;
rpm-build 4f3c61
rpm-build 4f3c61
	task = g_task_new (request, cancellable, callback, user_data);
rpm-build 4f3c61
rpm-build 4f3c61
	stream = soup_request_send (request, cancellable, &error);
rpm-build 4f3c61
	if (stream)
rpm-build 4f3c61
		g_task_return_pointer (task, stream, g_object_unref);
rpm-build 4f3c61
	else
rpm-build 4f3c61
		g_task_return_error (task, error);
rpm-build 4f3c61
	g_object_unref (task);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static GInputStream *
rpm-build 4f3c61
soup_request_default_send_finish (SoupRequest          *request,
rpm-build 4f3c61
				  GAsyncResult         *result,
rpm-build 4f3c61
				  GError              **error)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return g_task_propagate_pointer (G_TASK (result), error);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_send:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 * @cancellable: a #GCancellable or %NULL
rpm-build 4f3c61
 * @error: return location for a #GError, or %NULL
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Synchronously requests the URI pointed to by @request, and returns
rpm-build 4f3c61
 * a #GInputStream that can be used to read its contents.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Note that you cannot use this method with #SoupRequests attached to
rpm-build 4f3c61
 * a #SoupSessionAsync.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Return value: (transfer full): a #GInputStream that can be used to
rpm-build 4f3c61
 *   read from the URI pointed to by @request.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
GInputStream *
rpm-build 4f3c61
soup_request_send (SoupRequest          *request,
rpm-build 4f3c61
		   GCancellable         *cancellable,
rpm-build 4f3c61
		   GError              **error)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return SOUP_REQUEST_GET_CLASS (request)->
rpm-build 4f3c61
		send (request, cancellable, error);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_send_async:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 * @cancellable: a #GCancellable or %NULL
rpm-build 4f3c61
 * @callback: a #GAsyncReadyCallback
rpm-build 4f3c61
 * @user_data: user data passed to @callback
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Begins an asynchronously request for the URI pointed to by
rpm-build 4f3c61
 * @request.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Note that you cannot use this method with #SoupRequests attached to
rpm-build 4f3c61
 * a #SoupSessionSync.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
void
rpm-build 4f3c61
soup_request_send_async (SoupRequest         *request,
rpm-build 4f3c61
			 GCancellable        *cancellable,
rpm-build 4f3c61
			 GAsyncReadyCallback  callback,
rpm-build 4f3c61
			 gpointer             user_data)
rpm-build 4f3c61
{
rpm-build 4f3c61
	SOUP_REQUEST_GET_CLASS (request)->
rpm-build 4f3c61
		send_async (request, cancellable, callback, user_data);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_send_finish:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 * @result: the #GAsyncResult
rpm-build 4f3c61
 * @error: return location for a #GError, or %NULL
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Gets the result of a soup_request_send_async().
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Return value: (transfer full): a #GInputStream that can be used to
rpm-build 4f3c61
 *   read from the URI pointed to by @request.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
GInputStream *
rpm-build 4f3c61
soup_request_send_finish (SoupRequest          *request,
rpm-build 4f3c61
			  GAsyncResult         *result,
rpm-build 4f3c61
			  GError              **error)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return SOUP_REQUEST_GET_CLASS (request)->
rpm-build 4f3c61
		send_finish (request, result, error);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_class_init (SoupRequestClass *request_class)
rpm-build 4f3c61
{
rpm-build 4f3c61
	GObjectClass *object_class = G_OBJECT_CLASS (request_class);
rpm-build 4f3c61
rpm-build 4f3c61
	request_class->check_uri = soup_request_default_check_uri;
rpm-build 4f3c61
	request_class->send_async = soup_request_default_send_async;
rpm-build 4f3c61
	request_class->send_finish = soup_request_default_send_finish;
rpm-build 4f3c61
rpm-build 4f3c61
	object_class->finalize = soup_request_finalize;
rpm-build 4f3c61
	object_class->set_property = soup_request_set_property;
rpm-build 4f3c61
	object_class->get_property = soup_request_get_property;
rpm-build 4f3c61
rpm-build 4f3c61
	/**
rpm-build 4f3c61
	 * SOUP_REQUEST_URI:
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * Alias for the #SoupRequest:uri property, qv.
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * Since: 2.42
rpm-build 4f3c61
	 */
rpm-build 4f3c61
	/**
rpm-build 4f3c61
	 * SoupRequest:uri:
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * The request URI.
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * Since: 2.42
rpm-build 4f3c61
	 */
rpm-build 4f3c61
	g_object_class_install_property (
rpm-build 4f3c61
		 object_class, PROP_URI,
rpm-build 4f3c61
		 g_param_spec_boxed (SOUP_REQUEST_URI,
rpm-build 4f3c61
				     "URI",
rpm-build 4f3c61
				     "The request URI",
rpm-build 4f3c61
				     SOUP_TYPE_URI,
rpm-build 4f3c61
				     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
rpm-build 4f3c61
	/**
rpm-build 4f3c61
	 * SOUP_REQUEST_SESSION:
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * Alias for the #SoupRequest:session property, qv.
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * Since: 2.42
rpm-build 4f3c61
	 */
rpm-build 4f3c61
	/**
rpm-build 4f3c61
	 * SoupRequest:session:
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * The request's #SoupSession.
rpm-build 4f3c61
	 *
rpm-build 4f3c61
	 * Since: 2.42
rpm-build 4f3c61
	 */
rpm-build 4f3c61
	g_object_class_install_property (
rpm-build 4f3c61
		 object_class, PROP_SESSION,
rpm-build 4f3c61
		 g_param_spec_object (SOUP_REQUEST_SESSION,
rpm-build 4f3c61
				      "Session",
rpm-build 4f3c61
				      "The request's session",
rpm-build 4f3c61
				      SOUP_TYPE_SESSION,
rpm-build 4f3c61
				      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
soup_request_initable_interface_init (GInitableIface *initable_interface)
rpm-build 4f3c61
{
rpm-build 4f3c61
	initable_interface->init = soup_request_initable_init;
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_get_uri:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Gets @request's URI
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Return value: (transfer none): @request's URI
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
SoupURI *
rpm-build 4f3c61
soup_request_get_uri (SoupRequest *request)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return request->priv->uri;
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_get_session:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Gets @request's #SoupSession
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Return value: (transfer none): @request's #SoupSession
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
SoupSession *
rpm-build 4f3c61
soup_request_get_session (SoupRequest *request)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return request->priv->session;
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_get_content_length:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Gets the length of the data represented by @request. For most
rpm-build 4f3c61
 * request types, this will not be known until after you call
rpm-build 4f3c61
 * soup_request_send() or soup_request_send_finish().
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Return value: the length of the data represented by @request,
rpm-build 4f3c61
 *   or -1 if not known.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
goffset
rpm-build 4f3c61
soup_request_get_content_length (SoupRequest *request)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return SOUP_REQUEST_GET_CLASS (request)->get_content_length (request);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
/**
rpm-build 4f3c61
 * soup_request_get_content_type:
rpm-build 4f3c61
 * @request: a #SoupRequest
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Gets the type of the data represented by @request. For most request
rpm-build 4f3c61
 * types, this will not be known until after you call
rpm-build 4f3c61
 * soup_request_send() or soup_request_send_finish().
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * As in the HTTP Content-Type header, this may include parameters
rpm-build 4f3c61
 * after the MIME type.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Return value: (nullable): the type of the data represented by
rpm-build 4f3c61
 *   @request, or %NULL if not known.
rpm-build 4f3c61
 *
rpm-build 4f3c61
 * Since: 2.42
rpm-build 4f3c61
 */
rpm-build 4f3c61
const char *
rpm-build 4f3c61
soup_request_get_content_type (SoupRequest  *request)
rpm-build 4f3c61
{
rpm-build 4f3c61
	return SOUP_REQUEST_GET_CLASS (request)->get_content_type (request);
rpm-build 4f3c61
}