Example #1
0
static dlr_host_server_t *prv_host_server_new(const gchar *device_if,
					      guint port,
					      GError **error)
{
	dlr_host_server_t *server = NULL;
	SoupAddress *addr;

	addr = soup_address_new(device_if, port);

	if (soup_address_resolve_sync(addr, NULL) != SOUP_STATUS_OK) {
		*error = g_error_new(DLEYNA_SERVER_ERROR,
				     DLEYNA_ERROR_HOST_FAILED,
				     "Unable to create host server on %s",
				     device_if);
		goto on_error;
	}

	server = g_new(dlr_host_server_t, 1);
	server->files = g_hash_table_new_full(g_str_hash, g_str_equal,
					      g_free, prv_host_file_delete);

	server->soup_server = soup_server_new(SOUP_SERVER_INTERFACE, addr,
					      NULL);
	soup_server_add_handler(server->soup_server, DLR_HOST_SERVICE_ROOT,
				prv_soup_server_cb, server, NULL);
	soup_server_run_async(server->soup_server);
	server->counter = 0;

on_error:

	g_object_unref(addr);

	return server;
}
Example #2
0
static void
resolved_proxy_uri (SoupProxyURIResolver *proxy_resolver,
		    guint status, SoupURI *proxy_uri, gpointer user_data)
{
	SoupMessageQueueItem *item = user_data;
	SoupSession *session = item->session;

	if (item_failed (item, status))
		return;

	if (proxy_uri) {
		SoupAddress *proxy_addr;

		item->state = SOUP_MESSAGE_RESOLVING_PROXY_ADDRESS;

		item->proxy_uri = soup_uri_copy (proxy_uri);
		proxy_addr = soup_address_new (proxy_uri->host,
					       proxy_uri->port);
		soup_address_resolve_async (proxy_addr,
					    soup_session_get_async_context (session),
					    item->cancellable,
					    resolved_proxy_addr, item);
		g_object_unref (proxy_addr);
		return;
	}

	item->state = SOUP_MESSAGE_AWAITING_CONNECTION;
	soup_message_queue_item_unref (item);

	/* If we got here we know session still exists */
	run_queue ((SoupSessionAsync *)session);
}
Example #3
0
File: dns.c Project: raoariel/quark
int
main (int argc, char **argv)
{
    SoupAddress *addr;
    int i;

    if (argc < 2)
        usage ();

    g_thread_init (NULL);
    g_type_init ();

    for (i = 1; i < argc; i++) {
        addr = soup_address_new (argv[i], 0);
        if (!addr) {
            fprintf (stderr, "Could not parse address %s\n", argv[1]);
            exit (1);
        }

        soup_address_resolve_async (addr, NULL, NULL,
                                    resolve_callback, NULL);
        nlookups++;
    }

    loop = g_main_loop_new (NULL, TRUE);
    g_main_loop_run (loop);
    g_main_loop_unref (loop);

    return 0;
}
Example #4
0
static SoupSessionHost *
soup_session_host_new (SoupSession *session, SoupURI *uri)
{
	SoupSessionHost *host;

	host = g_slice_new0 (SoupSessionHost);
	host->uri = soup_uri_copy_host (uri);
	host->addr = soup_address_new (host->uri->host, host->uri->port);

	return host;
}
Example #5
0
static void
do_ipv6_test (void)
{
	SoupServer *ipv6_server;
	SoupURI *ipv6_uri;
	SoupAddress *ipv6_addr;
	SoupSession *session;
	SoupMessage *msg;

	debug_printf (1, "\nIPv6 server test\n");

	ipv6_addr = soup_address_new ("::1", SOUP_ADDRESS_ANY_PORT);
	soup_address_resolve_sync (ipv6_addr, NULL);
	ipv6_server = soup_server_new (SOUP_SERVER_INTERFACE, ipv6_addr,
				       NULL);
	g_object_unref (ipv6_addr);
	soup_server_add_handler (ipv6_server, NULL, ipv6_server_callback, NULL, NULL);
	soup_server_run_async (ipv6_server);

	ipv6_uri = soup_uri_new ("http://[::1]/");
	soup_uri_set_port (ipv6_uri, soup_server_get_port (ipv6_server));

	session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);

	debug_printf (1, "  HTTP/1.1\n");
	msg = soup_message_new_from_uri ("GET", ipv6_uri);
	soup_session_send_message (session, msg);
	if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
		debug_printf (1, "    request failed: %d %s\n",
			      msg->status_code, msg->reason_phrase);
		errors++;
	}
	g_object_unref (msg);

	debug_printf (1, "  HTTP/1.0\n");
	msg = soup_message_new_from_uri ("GET", ipv6_uri);
	soup_message_set_http_version (msg, SOUP_HTTP_1_0);
	soup_session_send_message (session, msg);
	if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
		debug_printf (1, "    request failed: %d %s\n",
			      msg->status_code, msg->reason_phrase);
		errors++;
	}
	g_object_unref (msg);

	soup_uri_free (ipv6_uri);
	soup_test_session_abort_unref (session);
	soup_test_server_quit_unref (ipv6_server);
}
Example #6
0
SoupServer *
soupcut_server_take_new (GMainContext *context)
{
    SoupServer *server;
    SoupAddress *address;

    address = soup_address_new("localhost", SOUP_ADDRESS_ANY_PORT);
    soup_address_resolve_sync(address, NULL);
    server = soup_server_new(SOUP_SERVER_INTERFACE, address,
                             SOUP_SERVER_ASYNC_CONTEXT, context,
                             NULL);
    g_object_unref(address);

    return soupcut_server_take(server);
}
Example #7
0
static void
seahorse_ldap_source_connect_async (SeahorseLDAPSource *source,
                                    GCancellable *cancellable,
                                    GAsyncReadyCallback callback,
                                    gpointer user_data)
{
	GSimpleAsyncResult *res;
	source_connect_closure *closure;
	gchar *server = NULL;
	gchar *pos;
#ifdef WITH_SOUP
	SoupAddress *address;
#endif

	res = g_simple_async_result_new (G_OBJECT (source), callback, user_data,
	                                 seahorse_ldap_source_connect_async);
	closure = g_new0 (source_connect_closure, 1);
	closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
	g_simple_async_result_set_op_res_gpointer (res, closure, source_connect_free);

	g_object_get (source, "key-server", &server, NULL);
	g_return_if_fail (server && server[0]);
	if ((pos = strchr (server, ':')) != NULL)
		*pos = 0;

	seahorse_progress_prep_and_begin (cancellable, res, NULL);

	/* If we have libsoup, try and resolve asynchronously */
#ifdef WITH_SOUP
	address = soup_address_new (server, LDAP_PORT);
	seahorse_progress_update (cancellable, res, _("Resolving server address: %s"), server);

	soup_address_resolve_async (address, NULL, cancellable,
	                            on_address_resolved_complete,
	                            g_object_ref (res));
	g_object_unref (address);

#else /* !WITH_SOUP */

	once_resolved_start_connect (source, res, server);

#endif

	g_free (server);
	g_object_unref (res);
}
Example #8
0
static SoupServer *
test_server_new (gboolean in_own_thread, gboolean ssl)
{
	SoupServer *server;
	GMainContext *async_context;
	const char *ssl_cert_file, *ssl_key_file;
	SoupAddress *addr;

	async_context = in_own_thread ? g_main_context_new () : NULL;

	if (ssl) {
		ssl_cert_file = SRCDIR "/test-cert.pem";
		ssl_key_file = SRCDIR "/test-key.pem";
	} else
		ssl_cert_file = ssl_key_file = NULL;

	addr = soup_address_new ("127.0.0.1", SOUP_ADDRESS_ANY_PORT);
	soup_address_resolve_sync (addr, NULL);

	server = soup_server_new (SOUP_SERVER_INTERFACE, addr,
				  SOUP_SERVER_ASYNC_CONTEXT, async_context,
				  SOUP_SERVER_SSL_CERT_FILE, ssl_cert_file,
				  SOUP_SERVER_SSL_KEY_FILE, ssl_key_file,
				  NULL);
	g_object_unref (addr);
	if (async_context)
		g_main_context_unref (async_context);

	if (!server) {
		fprintf (stderr, "Unable to create server\n");
		exit (1);
	}

	if (in_own_thread) {
		GThread *thread;

		thread = g_thread_create (run_server_thread, server,
					  TRUE, NULL);
		g_object_set_data (G_OBJECT (server), "thread", thread);
	} else
		soup_server_run_async (server);

	return server;
}
Example #9
0
WebKitTestServer::WebKitTestServer(ServerType type)
{
    GUniquePtr<char> sslCertificateFile;
    GUniquePtr<char> sslKeyFile;
    if (type == ServerHTTPS) {
        CString resourcesDir = Test::getResourcesDir();
        sslCertificateFile.reset(g_build_filename(resourcesDir.data(), "test-cert.pem", NULL));
        sslKeyFile.reset(g_build_filename(resourcesDir.data(), "test-key.pem", NULL));
    }

    GRefPtr<SoupAddress> address = adoptGRef(soup_address_new("127.0.0.1", SOUP_ADDRESS_ANY_PORT));
    soup_address_resolve_sync(address.get(), 0);

    m_soupServer = adoptGRef(soup_server_new(SOUP_SERVER_INTERFACE, address.get(),
        SOUP_SERVER_SSL_CERT_FILE, sslCertificateFile.get(),
        SOUP_SERVER_SSL_KEY_FILE, sslKeyFile.get(), nullptr));
    m_baseURI = type == ServerHTTPS ? soup_uri_new("https://127.0.0.1/") : soup_uri_new("http://127.0.0.1/");
    soup_uri_set_port(m_baseURI, soup_server_get_port(m_soupServer.get()));
}
Example #10
0
int
main (int argc, char **argv)
{
	int opt, debug = 0, listener, sin_len, port, i;
	struct sockaddr_in sin;
	GThread *server;
	char writebuf[BUFSIZE], readbuf[BUFSIZE];
	SoupAddress *addr;
	SoupSSLCredentials *creds;
	SoupSocket *sock;
	gsize n, total;
	SoupSocketIOStatus status;
	int connect_status;
	GError *error = NULL;

	g_thread_init (NULL);
	g_type_init ();

	/* On Windows, this will call WSAStartup() */
	soup_socket_get_type ();

	while ((opt = getopt (argc, argv, "c:d:k:")) != -1) {
		switch (opt) {
		case 'c':
			ssl_cert_file = optarg;
			break;
		case 'd':
			debug = atoi (optarg);
			break;
		case 'k':
			ssl_key_file = optarg;
			break;

		case '?':
			fprintf (stderr, "Usage: %s [-d debuglevel] [-c ssl-cert-file] [-k ssl-key-file]\n",
				 argv[0]);
			break;
		}
	}

	if (debug) {
		gnutls_global_set_log_function (debug_log);
		gnutls_global_set_log_level (debug);
	}

	/* Create server socket */
	listener = socket (AF_INET, SOCK_STREAM, 0);
	if (listener == -1) {
		SOCKET_PRINT_ERROR ("creating listening socket");
		exit (1);
	}

	memset (&sin, 0, sizeof (sin));
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = ntohl (INADDR_LOOPBACK);

	if (bind (listener, (struct sockaddr *) &sin, sizeof (sin))  == -1) {
		SOCKET_PRINT_ERROR ("binding listening socket");
		exit (1);
	}

	if (listen (listener, 1) == -1) {
		SOCKET_PRINT_ERROR ("listening on socket");
		exit (1);
	}

	sin_len = sizeof (sin);
	getsockname (listener, (struct sockaddr *)&sin, (void *)&sin_len);
	port = ntohs (sin.sin_port);

	/* Create the client */
	addr = soup_address_new ("127.0.0.1", port);
	creds = soup_ssl_get_client_credentials (NULL);
	sock = soup_socket_new (SOUP_SOCKET_REMOTE_ADDRESS, addr,
				SOUP_SOCKET_FLAG_NONBLOCKING, FALSE,
				SOUP_SOCKET_SSL_CREDENTIALS, creds,
				NULL);
	g_object_unref (addr);
	connect_status = soup_socket_connect_sync (sock, NULL);
	if (connect_status != SOUP_STATUS_OK) {
		g_error ("Could not create client socket: %s",
			 soup_status_get_phrase (connect_status));
	}

	soup_socket_start_ssl (sock, NULL);

	/* Now spawn server thread */
	server = g_thread_create (server_thread, GINT_TO_POINTER (listener),
				  TRUE, NULL);

	/* Synchronous client test */
	for (i = 0; i < BUFSIZE; i++)
		writebuf[i] = i & 0xFF;

	total = 0;
	while (total < BUFSIZE) {
		status = soup_socket_write (sock, writebuf + total,
					    BUFSIZE - total, &n,
					    NULL, &error);
		if (status != SOUP_SOCKET_OK)
			g_error ("Sync write got status %d: %s", status,
				 error ? error->message : "(unknown)");
		total += n;
	}

	total = 0;
	while (total < BUFSIZE) {
		status = soup_socket_read (sock, readbuf + total,
					   BUFSIZE - total, &n,
					   NULL, &error);
		if (status != SOUP_SOCKET_OK)
			g_error ("Sync read got status %d: %s", status,
				 error ? error->message : "(unknown)");
		total += n;
	}

	if (memcmp (writebuf, readbuf, BUFSIZE) != 0)
		g_error ("Sync read didn't match write");

	printf ("SYNCHRONOUS SSL TEST PASSED\n");

	/* Switch socket to async and do it again */

	g_object_set (sock,
		      SOUP_SOCKET_FLAG_NONBLOCKING, TRUE,
		      NULL);

	g_idle_add (start_writing, sock);
	loop = g_main_loop_new (NULL, TRUE);
	g_main_loop_run (loop);
	g_main_loop_unref (loop);
	g_main_context_unref (g_main_context_default ());

	printf ("ASYNCHRONOUS SSL TEST PASSED\n");

	g_object_unref (sock);
	soup_ssl_free_client_credentials (creds);
	g_thread_join (server);

	/* Success */
	return 0;
}
Example #11
0
gboolean
rcd_rpc_remote_server_start (void)
{
    SoupServerAuthContext auth_ctx = { 0 };
    int port = rcd_prefs_get_remote_server_port ();
    const char *bind_ip;

    /* Server's already running... */
    if (soup_server != NULL)
        return TRUE;

    rc_debug (RC_DEBUG_LEVEL_MESSAGE, "Starting remote server");

    bind_ip = rcd_prefs_get_bind_ipaddress ();

    if (bind_ip) {
        SoupAddress *bind_address;

        bind_address = soup_address_new (bind_ip, port);

        if (!bind_address) {
            rc_debug (RC_DEBUG_LEVEL_ERROR,
                      "Unable to bind remote server to '%s'", bind_ip);
            return FALSE;
        }

        if (soup_address_resolve_sync (bind_address) != SOUP_STATUS_OK) {
            rc_debug (RC_DEBUG_LEVEL_ERROR,
                      "Unable to bind remote server to '%s': Unable to "
                      "resolve address", bind_ip);
            return FALSE;
        }

        soup_server = soup_server_new (SOUP_SERVER_INTERFACE, bind_address,
                                       SOUP_SERVER_PORT, port,
                                       SOUP_SERVER_SSL_CERT_FILE, SHAREDIR"/rcd.pem",
                                       SOUP_SERVER_SSL_KEY_FILE, SHAREDIR"/rcd.pem",
                                       NULL);

        g_object_unref (bind_address);
    } else {
        soup_server = soup_server_new (SOUP_SERVER_PORT, port,
                                       SOUP_SERVER_SSL_CERT_FILE, SHAREDIR"/rcd.pem",
                                       SOUP_SERVER_SSL_KEY_FILE, SHAREDIR"/rcd.pem",
                                       NULL);
    }

    if (!soup_server) {
        rc_debug (RC_DEBUG_LEVEL_ERROR, "Could not start RPC server on port %d", port);
        rc_debug (RC_DEBUG_LEVEL_ERROR, "(This may mean that another rcd process is already running, or that");
        rc_debug (RC_DEBUG_LEVEL_ERROR, "you are not running as root and do not have the correct privileges");
        rc_debug (RC_DEBUG_LEVEL_ERROR, "on this port.)");
        return FALSE;
    }

    g_object_set (G_OBJECT (soup_server_get_listener (soup_server)),
                  SOUP_SOCKET_FLAG_CLOEXEC, TRUE,
                  NULL);

    auth_ctx.types = SOUP_AUTH_TYPE_DIGEST;
    auth_ctx.callback = soup_auth_callback;
    auth_ctx.digest_info.realm = "RCD";
    auth_ctx.digest_info.allow_algorithms = SOUP_ALGORITHM_MD5;
    auth_ctx.digest_info.force_integrity = FALSE;
        
    soup_server_add_handler (soup_server, "/RPC2", &auth_ctx,
                             soup_rpc_callback, NULL, NULL);
    soup_server_add_handler (soup_server, NULL, NULL,
                             soup_default_callback, NULL, NULL);
        
    soup_server_run_async (soup_server);
    g_object_unref (soup_server);

    notify_port_change (port);

    return TRUE;
}
Example #12
0
static void
do_callback_unref_test (void)
{
	SoupServer *bad_server;
	SoupAddress *addr;
	SoupSession *session;
	SoupMessage *one, *two;
	GMainLoop *loop;
	char *bad_uri;

	debug_printf (1, "\nCallback unref handling\n");

	/* Get a guaranteed-bad URI */
	addr = soup_address_new ("127.0.0.1", SOUP_ADDRESS_ANY_PORT);
	soup_address_resolve_sync (addr, NULL);
	bad_server = soup_server_new (SOUP_SERVER_INTERFACE, addr,
				      NULL);
	g_object_unref (addr);

	bad_uri = g_strdup_printf ("http://127.0.0.1:%u/",
				   soup_server_get_port (bad_server));
	g_object_unref (bad_server);

	session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
	g_object_add_weak_pointer (G_OBJECT (session), (gpointer *)&session);

	loop = g_main_loop_new (NULL, TRUE);

	one = soup_message_new ("GET", bad_uri);
	g_object_add_weak_pointer (G_OBJECT (one), (gpointer *)&one);
	two = soup_message_new ("GET", bad_uri);
	g_object_add_weak_pointer (G_OBJECT (two), (gpointer *)&two);
	g_free (bad_uri);

	soup_session_queue_message (session, one, cu_one_completed, loop);
	soup_session_queue_message (session, two, cu_two_completed, loop);

	g_main_loop_run (loop);
	g_main_loop_unref (loop);

	if (session) {
		g_object_remove_weak_pointer (G_OBJECT (session), (gpointer *)&session);
		debug_printf (1, "  Session not destroyed?\n");
		errors++;
		g_object_unref (session);
	}
	if (one) {
		g_object_remove_weak_pointer (G_OBJECT (one), (gpointer *)&one);
		debug_printf (1, "  Message 1 not destroyed?\n");
		errors++;
		g_object_unref (one);
	}
	if (two) {
		g_object_remove_weak_pointer (G_OBJECT (two), (gpointer *)&two);
		debug_printf (1, "  Message 2 not destroyed?\n");
		errors++;
		g_object_unref (two);
	}

	/* Otherwise, if we haven't crashed, we're ok. */
}
Example #13
0
//this will insert proxy in the session
//and queue the message to be sent
void
proxify_session_async(EProxy *proxy, STNET *stnet)
{
	SoupURI *proxy_uri = NULL, *su;
#if EVOLUTION_VERSION < 30304
	gint ptype = gconf_client_get_int (
			rss_gconf, KEY_GCONF_EVO_PROXY_TYPE, NULL);
#else
	GSettings *settings = g_settings_new(CONF_SCHEMA_EVO_NETWORK);
	gint ptype = g_settings_get_int (
			settings, CONF_EVO_PROXY_TYPE);
#endif

	switch (ptype) {
#ifndef HAVE_LIBSOUP_GNOME
	case 0:
#endif
	case 2:
		su = soup_uri_new (stnet->url);
		stnet->host = su->host;
		if (su) {
			if (su->scheme == SOUP_URI_SCHEME_HTTPS) {
				if (rss_ep_need_proxy_https (proxy, su->host)) {
#if (DATASERVER_VERSION >=2026000)
					proxy_uri = e_proxy_peek_uri_for (proxy, stnet->url);
#else
					g_print("WARN: e_proxy_peek_uri_for() requires evolution-data-server 2.26\n");
					soup_uri_free(su);
					return;
#endif
					if (proxy_uri) {
						d("proxified %s with %s:%d\n", stnet->url, proxy_uri->host, proxy_uri->port);
					}
				} else {
					d("no PROXY-%s\n", stnet->url);
				}
				g_object_set (
					G_OBJECT (stnet->ss),
					SOUP_SESSION_PROXY_URI,
					proxy_uri, NULL);
				soup_uri_free(su);
				goto out;
			} else {
				stnet->addr = soup_address_new (su->host, 0);
				soup_uri_free(su);
				soup_address_resolve_async (stnet->addr, NULL, NULL,
					rss_resolve_callback, stnet);
				return;
			}
		}
		break;

#ifdef HAVE_LIBSOUP_GNOME
	case 0:
		soup_session_add_feature_by_type (
			stnet->ss, SOUP_TYPE_PROXY_RESOLVER_DEFAULT);
		break;
#endif
	}

out:	stnet->callback(stnet->data);
	//free stnet
}