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; }