char *
remote_display_host_file (RemoteDisplayHost *host,
			  const char        *uri,
			  GError           **error)
{
	RemoteDisplayHostPrivate *priv;
	RemoteDisplayHostFile *file;
	GChecksum *checksum;
	const char *str;
	char *path, *scheme, *ret;
	GFile *gfile;

	g_return_val_if_fail (REMOTE_DISPLAY_IS_HOST (host), FALSE);
	g_return_val_if_fail (uri != NULL, FALSE);

	priv = GET_PRIVATE (host);

	scheme = g_uri_parse_scheme (uri);
	if (g_strcmp0 (scheme, "http") == 0 ||
	    g_strcmp0 (scheme, "https") == 0) {
		g_debug ("Not serving %s", uri);
		g_free (scheme);
		return g_strdup (uri);
	}
	g_free (scheme);

	gfile = g_file_new_for_uri (uri);
	path = g_file_get_path (gfile);
	g_object_unref (gfile);
	if (!path) {
		g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
			     "Cannot serve URI '%s'", uri);
		return NULL;
	}

	if (!priv->server_started) {
		GSocketAddress *addr;

		addr = g_inet_socket_address_new (priv->local_address, 0);
		if (!soup_server_listen (priv->server, addr, 0, error)) {
			g_clear_object (&addr);
			g_free (path);
			return FALSE;
		}
		g_object_unref (addr);
		priv->server_started = TRUE;
	}

	checksum = g_checksum_new (G_CHECKSUM_SHA256);
	g_checksum_update (checksum, (const guchar *) uri, strlen (uri));
	str = g_checksum_get_string (checksum);

	file = g_new0 (RemoteDisplayHostFile, 1);
	file->uri = g_strdup (uri);
	file->path = path;
	file->mime_type = g_content_type_guess (file->path, NULL, 0, NULL);

	g_hash_table_insert (priv->files, g_strdup (str), file);

	ret = get_server_uri (priv->server, str);
	g_checksum_free (checksum);

	return ret;
}
static gboolean
run_server (guint * http_port, guint * https_port)
{
  guint port = SOUP_ADDRESS_ANY_PORT;
  guint ssl_port = SOUP_ADDRESS_ANY_PORT;
  const char *ssl_cert_file = GST_TEST_FILES_PATH "/test-cert.pem";
  const char *ssl_key_file = GST_TEST_FILES_PATH "/test-key.pem";
  static int server_running = 0;
  GSocketAddress *address;
  GError *err = NULL;

  SoupAuthDomain *domain = NULL;

  if (server_running)
    return TRUE;

  server_running = 1;

  *http_port = *https_port = 0;

  server = soup_server_new (NULL, NULL);
  if (!server) {
    GST_DEBUG ("Unable to create server");
    return FALSE;
  }
  soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
  domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, realm,
      SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, basic_auth_cb,
      SOUP_AUTH_DOMAIN_ADD_PATH, basic_auth_path, NULL);
  soup_server_add_auth_domain (server, domain);
  g_object_unref (domain);
  domain = soup_auth_domain_digest_new (SOUP_AUTH_DOMAIN_REALM, realm,
      SOUP_AUTH_DOMAIN_DIGEST_AUTH_CALLBACK, digest_auth_cb,
      SOUP_AUTH_DOMAIN_ADD_PATH, digest_auth_path, NULL);
  soup_server_add_auth_domain (server, domain);
  g_object_unref (domain);

  address = g_inet_socket_address_new_from_string ("0.0.0.0", port);
  soup_server_listen (server, address, 0, &err);
  g_object_unref (address);
  if (err) {
    stop_server ();
    g_clear_error (&err);
    return FALSE;
  }

  *http_port = get_port_from_server (server);
  GST_DEBUG ("HTTP server listening on port %u", *http_port);

  if (ssl_cert_file && ssl_key_file) {
    GTlsBackend *backend = g_tls_backend_get_default ();

    if (backend != NULL && g_tls_backend_supports_tls (backend)) {
      ssl_server = soup_server_new (SOUP_SERVER_SSL_CERT_FILE, ssl_cert_file,
          SOUP_SERVER_SSL_KEY_FILE, ssl_key_file, NULL);
    } else {
      GST_INFO ("No TLS support");
    }

    if (ssl_server) {
      GST_INFO ("HTTPS server listening on port %u", *https_port);
      soup_server_add_handler (ssl_server, NULL, server_callback, NULL, NULL);
      address = g_inet_socket_address_new_from_string ("0.0.0.0", ssl_port);
      soup_server_listen (ssl_server, address, SOUP_SERVER_LISTEN_HTTPS, &err);
      g_object_unref (address);

      if (err) {
        GST_ERROR ("Failed to start HTTPS server: %s", err->message);
        stop_server ();
        g_clear_error (&err);
        return FALSE;
      }

      *https_port = get_port_from_server (ssl_server);
      GST_DEBUG ("HTTPS server listening on port %u", *https_port);
    }
  }

  /* check if we can connect to our local http server */
  {
    GSocketConnection *conn;
    GSocketClient *client;

    client = g_socket_client_new ();
    g_socket_client_set_timeout (client, 2);
    conn = g_socket_client_connect_to_host (client, "127.0.0.1", *http_port,
        NULL, NULL);
    if (conn == NULL) {
      GST_INFO ("Couldn't connect to http server 127.0.0.1:%u", *http_port);
      g_object_unref (client);
      stop_server ();
      return FALSE;
    }
    g_object_unref (conn);

    if (ssl_server == NULL)
      goto skip_https_check;

    conn = g_socket_client_connect_to_host (client, "127.0.0.1", *https_port,
        NULL, NULL);
    if (conn == NULL) {
      GST_INFO ("Couldn't connect to https server 127.0.0.1:%u", *https_port);
      g_object_unref (client);
      stop_server ();
      return FALSE;
    }
    g_object_unref (conn);

  skip_https_check:

    g_object_unref (client);
  }

  return TRUE;
}