Skip to content

RDKTV-35185: Syncup with 25Q1_sprint #134

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
80 changes: 53 additions & 27 deletions server/gdial-rest.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,12 @@ static void gdial_soup_message_set_http_error(SoupMessage *msg, guint state_code
g_string_free(value_buf, FALSE); \
}

static GList *gdial_rest_server_registered_apps_clear(GList *registered_apps, GList *found) {
static GList *gdial_rest_server_registered_apps_clear(GDialRestServer *self, GList *registered_apps, GList *found) {
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
GDialAppRegistry *app_registry = (GDialAppRegistry *)found->data;
registered_apps = g_list_remove_link(registered_apps, found);
GDIAL_LOGINFO("gdial_local_rest_http_server_callback handler Removed for App[%s]instance[%x]", app_registry->name,priv->local_soup_instance);
soup_server_remove_handler(priv->local_soup_instance, app_registry->app_uri);
gdial_app_regstry_dispose (app_registry);
g_list_free(found);
return registered_apps;
Expand Down Expand Up @@ -208,6 +211,14 @@ static gint GCompareFunc_match_registry_app_name(gconstpointer a, gconstpointer
return is_matched ? 0 : 1;
}

static gint GCompareFunc_match_registry_app_uuid(gconstpointer a, gconstpointer b) {
GDialAppRegistry *app_registry = (GDialAppRegistry *)a;
int is_matched = 0;
/* match by exact uuid */
is_matched = (g_strcmp0(&app_registry->app_uri[1], b) == 0);
return is_matched ? 0 : 1;
}

GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry(GDialRestServer *self, const gchar *app_name) {
g_return_val_if_fail(self != NULL && app_name != NULL, FALSE);
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
Expand All @@ -218,6 +229,16 @@ GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry(GDialRestServ
return NULL;
}

GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry_by_uuid(GDialRestServer *self, const gchar *app_uuid) {
g_return_val_if_fail(self != NULL && app_uuid != NULL, FALSE);
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
GList *found = g_list_find_custom(priv->registered_apps, app_uuid, GCompareFunc_match_registry_app_uuid);
if (found) {
return (GDialAppRegistry *)found->data;
}
return NULL;
}

GDIAL_STATIC gboolean gdial_rest_server_is_allowed_youtube_origin(GDialRestServer *self, const gchar *header_origin, const gchar *app_name) {
if (self == NULL) return FALSE;

Expand Down Expand Up @@ -281,7 +302,7 @@ GDIAL_STATIC gboolean gdial_rest_server_is_allowed_origin(GDialRestServer *self,
return is_allowed;
}

GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode) {
GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode , const gchar* app_uri) {
/*
* The specifciation of additionalDataUrl in form of /apps/<app_name>/dial_data
* thus the instance data must be included in the query or payload, not the path.
Expand All @@ -291,7 +312,7 @@ GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_po
* for MIME type application/x-www-form-urlencoded.]]
*/
GString *url_buf = g_string_new("");
g_string_printf(url_buf, "http://%s:%d%s/%s%s", "localhost", listening_port, GDIAL_REST_HTTP_APPS_URI, app_name, GDIAL_REST_HTTP_DIAL_DATA_URI);
g_string_printf(url_buf, "http://%s:%d%s%s", "localhost", listening_port, app_uri, GDIAL_REST_HTTP_DIAL_DATA_URI);
gchar *unencoded = g_string_free(url_buf, FALSE);
if (encode) {
gchar *encoded = soup_uri_encode(unencoded, NULL);
Expand Down Expand Up @@ -433,7 +454,7 @@ static void gdial_rest_server_handle_POST(GDialRestServer *gdial_rest_server, So
if (new_app_instance) {
gchar *additional_data_url = NULL;
if (app_registry->use_additional_data) {
additional_data_url = gdial_rest_server_new_additional_data_url(listening_port, app_registry->name, FALSE);
additional_data_url = gdial_rest_server_new_additional_data_url(listening_port, app_registry->name, FALSE, app_registry->app_uri );
}
gchar *additional_data_url_safe = soup_uri_encode(additional_data_url, NULL);
GDIAL_LOGINFO("additionalDataUrl = %s, %s", additional_data_url, additional_data_url_safe);
Expand Down Expand Up @@ -673,13 +694,12 @@ static void gdial_local_rest_http_server_callback(SoupServer *server,
SoupMessage *msg, const gchar *path, GHashTable *query,
SoupClientContext *client, gpointer user_data) {
gchar *remote_address_str = g_inet_address_to_string(g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(soup_client_context_get_remote_address(client))));
g_print_with_timestamp("gdial_local_rest_http_server_callback() %s path=%s recv from [%s], in thread %lx", msg->method, path, remote_address_str, pthread_self());
GDIAL_LOGINFO("method[%s] path[%s] recv from [%s], in thread %lx", msg->method, path, remote_address_str, pthread_self());
g_free(remote_address_str);
GDialRestServer *gdial_rest_server = (GDIAL_REST_SERVER(user_data));
gchar **elements = g_strsplit(&path[1], "/", 4);
gchar **elements = g_strsplit(&path[1], "/", 3);
gdial_rest_server_http_return_if_fail(elements != NULL, msg, SOUP_STATUS_NOT_IMPLEMENTED);
gchar base[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
gchar app_name[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
gchar instance[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
gchar last_elem[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
int i = 0;
Expand All @@ -691,37 +711,35 @@ static void gdial_local_rest_http_server_callback(SoupServer *server,
GDIAL_LOGWARNING("Warn: empty elements in URI path");
continue;
}
if (j == 0) g_strlcpy(base, elements[i], sizeof(base));
else if (j == 1) {
ret = g_strlcpy(app_name, elements[i], sizeof(app_name));
if (ret >= sizeof(app_name)) {
g_printerr("Warn: app_name too long\r\n");
}
if (j == 0) {
g_strlcpy(base, elements[i], sizeof(base));
}
else if (j == 2) {
else if (j == 1) {
ret = g_strlcpy(instance, elements[i], sizeof(instance));
if (ret >= sizeof(instance)) {
g_printerr("Warn: instance too long\r\n");
GDIAL_LOGERROR("Warn: instance too long");
}
}
ret = g_strlcpy(last_elem, elements[i], sizeof(last_elem));
if (ret >= sizeof(last_elem)) {
g_printerr("Warn: last_elem too long\r\n");
GDIAL_LOGERROR("Warn: last_elem too long");
}
GDIAL_LOGINFO("last_elem[%s]", last_elem);
j++;
}
g_strfreev(elements);
const int element_num = j;
GDIAL_LOGINFO("there are %d non-empty elems", element_num);
if(element_num == 3 && g_strcmp0(instance,"dial_data") == 0)
if(element_num == 2 && g_strcmp0(instance,"dial_data") == 0)
{
GDialAppRegistry *app_registry = gdial_rest_server_find_app_registry(gdial_rest_server, app_name);
GDialAppRegistry *app_registry = gdial_rest_server_find_app_registry_by_uuid(gdial_rest_server, base);

gdial_rest_server_http_return_if_fail(app_registry, msg, SOUP_STATUS_NOT_FOUND);
if (msg->method == SOUP_METHOD_POST) {
gdial_rest_server_handle_POST_dial_data(gdial_rest_server, msg, query, app_name);
gdial_rest_server_handle_POST_dial_data(gdial_rest_server, msg, query, app_registry->name);
}
else if (msg->method == SOUP_METHOD_GET) {
gdial_rest_server_handle_GET_app(gdial_rest_server, msg, query, app_name, GDIAL_APP_INSTANCE_NULL);
gdial_rest_server_handle_GET_app(gdial_rest_server, msg, query, app_registry->name, GDIAL_APP_INSTANCE_NULL);
}
else {
gdial_rest_server_http_return_if_fail(msg->method == SOUP_METHOD_POST, msg, SOUP_STATUS_NOT_IMPLEMENTED);
Expand Down Expand Up @@ -981,7 +999,7 @@ static void gdial_rest_server_dispose(GObject *object) {
g_object_unref(priv->soup_instance);
g_object_unref(priv->local_soup_instance);
while (priv->registered_apps) {
priv->registered_apps = gdial_rest_server_registered_apps_clear(priv->registered_apps, priv->registered_apps);
priv->registered_apps = gdial_rest_server_registered_apps_clear(object, priv->registered_apps, priv->registered_apps);
}
G_OBJECT_CLASS (gdial_rest_server_parent_class)->dispose (object);
}
Expand Down Expand Up @@ -1102,10 +1120,7 @@ GDialRestServer *gdial_rest_server_new(SoupServer *rest_http_server,SoupServer *
*/
soup_server_add_handler(rest_http_server, "/apps/system", gdial_rest_http_server_system_callback, object, NULL);
#endif
GDIAL_LOGINFO("gdial_local_rest_http_server_callback add handler");
GDIAL_REST_HTTP_APPS_URI = g_strdup_printf("/%s", random_id);

soup_server_add_handler(local_rest_http_server, GDIAL_REST_HTTP_APPS_URI, gdial_local_rest_http_server_callback, object, NULL);
return object;
}

Expand Down Expand Up @@ -1147,6 +1162,12 @@ gboolean gdial_rest_server_register_app(GDialRestServer *self, const gchar *app_
}
g_return_val_if_fail(priv->registered_apps != NULL, FALSE);
g_return_val_if_fail(gdial_rest_server_is_app_registered(self, app_name), FALSE);

if( 0 != strcmp(app_name,"system"))
{
GDIAL_LOGINFO("gdial_local_rest_http_server_callback handler added for App[%s]uri[%s]instance[%x]",app_name,app_registry->app_uri,priv->local_soup_instance);
soup_server_add_handler(priv->local_soup_instance, app_registry->app_uri, gdial_local_rest_http_server_callback, self, NULL);
}
GDIAL_LOGTRACE("Exiting ...");
return TRUE;
}
Expand Down Expand Up @@ -1174,6 +1195,11 @@ gboolean gdial_rest_server_register_app_registry(GDialRestServer *self, GDialApp

g_return_val_if_fail(priv->registered_apps != NULL, FALSE);
g_return_val_if_fail(gdial_rest_server_is_app_registered(self, app_registry->name), FALSE);
if( 0 != strcmp(app_registry->name,"system"))
{
GDIAL_LOGINFO("gdial_local_rest_http_server_callback handler added for App[%s]uri[%s]instance[%x]",app_registry->name,app_registry->app_uri,priv->local_soup_instance);
soup_server_add_handler(priv->local_soup_instance, app_registry->app_uri, gdial_local_rest_http_server_callback, self, NULL);
}
return TRUE;
}

Expand Down Expand Up @@ -1204,7 +1230,7 @@ gboolean gdial_rest_server_unregister_all_apps(GDialRestServer *self) {
priv->registered_apps = registered_apps_head;
/*Remove all registered apps before*/
while (priv->registered_apps) {
priv->registered_apps = gdial_rest_server_registered_apps_clear(priv->registered_apps, priv->registered_apps);
priv->registered_apps = gdial_rest_server_registered_apps_clear(self, priv->registered_apps, priv->registered_apps);
}
GDIAL_LOGTRACE("Exiting ...");
return TRUE;
Expand All @@ -1219,7 +1245,7 @@ gboolean gdial_rest_server_unregister_app(GDialRestServer *self, const gchar *ap
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
GList *found = g_list_find_custom(priv->registered_apps, app_name, GCompareFunc_match_registry_app_name);
if (found == NULL) return FALSE;
priv->registered_apps = gdial_rest_server_registered_apps_clear(priv->registered_apps, found);
priv->registered_apps = gdial_rest_server_registered_apps_clear(self, priv->registered_apps, found);
return TRUE;
}

Expand Down Expand Up @@ -1334,4 +1360,4 @@ GDIAL_STATIC_INLINE void GET_APP_response_builder_destroy(void *builder) {
g_free(rbuilder->additionalData);

g_free(builder);
}
}
3 changes: 2 additions & 1 deletion server/gdial-rest.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,9 @@ gboolean gdial_rest_server_unregister_all_apps(GDialRestServer *self);
typedef struct _GDialAppRegistry GDialAppRegistry;

GDIAL_STATIC gboolean gdial_rest_server_is_allowed_origin(GDialRestServer *self, const gchar *header_origin, const gchar *app_name);
GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode);
GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode, const gchar* app_uri);
GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry(GDialRestServer *self, const gchar *app_name);
GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry_by_uuid(GDialRestServer *self, const gchar *app_uuid);

G_END_DECLS

Expand Down
Loading