[Swfdec-commits] 5 commits - swfdec-gtk/swfdec_gtk_loader.c swfdec/swfdec_as_interpret.c swfdec/swfdec_as_strings.c swfdec/swfdec_file_loader.c swfdec/swfdec_loader.h swfdec/swfdec_load_object_as.c swfdec/swfdec_load_object.c swfdec/swfdec_load_object.h swfdec/swfdec_player.c swfdec/swfdec_player_internal.h tools/crashfinder.c
Pekka Lampila
medar at kemper.freedesktop.org
Mon Jun 9 04:03:20 PDT 2008
swfdec-gtk/swfdec_gtk_loader.c | 12 ++++-
swfdec/swfdec_as_interpret.c | 4 -
swfdec/swfdec_as_strings.c | 2
swfdec/swfdec_file_loader.c | 3 -
swfdec/swfdec_load_object.c | 20 ++++++++-
swfdec/swfdec_load_object.h | 6 ++
swfdec/swfdec_load_object_as.c | 88 ++++++++++++++++++++++++++++++++++++++--
swfdec/swfdec_loader.h | 5 +-
swfdec/swfdec_player.c | 10 +++-
swfdec/swfdec_player_internal.h | 9 +++-
tools/crashfinder.c | 4 +
11 files changed, 146 insertions(+), 17 deletions(-)
New commits:
commit 4bdee7a29c106ba32947608fc9f51c90a47753f5
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Mon Jun 9 14:00:15 2008 +0300
If _customHeaders has uneven amount of elements, the last one is ignored
diff --git a/swfdec/swfdec_load_object_as.c b/swfdec/swfdec_load_object_as.c
index b5303ad..0571990 100644
--- a/swfdec/swfdec_load_object_as.c
+++ b/swfdec/swfdec_load_object_as.c
@@ -163,8 +163,9 @@ swfdec_load_object_as_get_headers (SwfdecAsObject *object, guint *header_count,
name = NULL;
}
}
+ // if there is uneven amount of elements, just ignore the last one
if (name != NULL)
- SWFDEC_FIXME ("_customHeaders with uneven amount of elements, what to do?");
+ SWFDEC_WARNING ("_customHeaders with uneven amount of elements");
end:
g_assert (array_names->len == array_values->len);
commit 6235118844a5b21e35655a7b03f8a0291c9f66af
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Mon Jun 9 13:41:05 2008 +0300
Disallow certain custom HTTP headers
Hopefully the list is complete
diff --git a/swfdec/swfdec_load_object_as.c b/swfdec/swfdec_load_object_as.c
index fc97b7c..b5303ad 100644
--- a/swfdec/swfdec_load_object_as.c
+++ b/swfdec/swfdec_load_object_as.c
@@ -103,10 +103,19 @@ static void
swfdec_load_object_as_get_headers (SwfdecAsObject *object, guint *header_count,
char ***header_names, char ***header_values)
{
+ // Should these be filtered at some other point instead?
+ static const char *disallowed_names[] = { "Accept-Ranges", "Age", "Allow",
+ "Allowed", "Connection", "Content-Length", "Content-Location",
+ "Content-Range", "ETag", "Host", "Last-Modified", "Location",
+ "Max-Forwards", "Proxy-Authenticate", "Proxy-Authorization", "Public",
+ "Range", "Referer", "Retry-After", "Server", "TE", "Trailer",
+ "Transfer-Encoding", "Upgrade", "URI", "Vary", "Via", "Warning",
+ "WWW-Authenticate", "x-flash-version" };
GPtrArray *array_names, *array_values;
SwfdecAsValue val;
SwfdecAsObject *list;
int i, length;
+ guint j;
const char *name;
SwfdecAsContext *cx;
@@ -142,9 +151,15 @@ swfdec_load_object_as_get_headers (SwfdecAsObject *object, guint *header_count,
if (name == NULL) {
name = swfdec_as_value_to_string (cx, &val);
} else {
- g_ptr_array_add (array_names, g_strdup (name));
- g_ptr_array_add (array_values,
- g_strdup (swfdec_as_value_to_string (cx, &val)));
+ for (j = 0; j < G_N_ELEMENTS (disallowed_names); j++) {
+ if (g_ascii_strcasecmp (name, disallowed_names[j]) == 0)
+ break;
+ }
+ if (j >= G_N_ELEMENTS (disallowed_names)) {
+ g_ptr_array_add (array_names, g_strdup (name));
+ g_ptr_array_add (array_values,
+ g_strdup (swfdec_as_value_to_string (cx, &val)));
+ }
name = NULL;
}
}
commit bd6dceb0cce3dfec465369e63768495c915e61e7
Merge: dcddc89... 3bec231...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Mon Jun 9 10:49:29 2008 +0300
Merge branch 'master' of ssh://medar@git.freedesktop.org/git/swfdec/swfdec
commit dcddc8992ffc8547cf61b3f38869cc25fa138e11
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Mon Jun 9 10:47:48 2008 +0300
Add support for sending custom headers (LoadVars/XML). Changes Loader API
diff --git a/swfdec-gtk/swfdec_gtk_loader.c b/swfdec-gtk/swfdec_gtk_loader.c
index 1793a03..51bb8aa 100644
--- a/swfdec-gtk/swfdec_gtk_loader.c
+++ b/swfdec-gtk/swfdec_gtk_loader.c
@@ -128,9 +128,11 @@ swfdec_gtk_loader_dispose (GObject *object)
static void
swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecPlayer *player,
- const char *url_string, SwfdecBuffer *buffer)
+ const char *url_string, SwfdecBuffer *buffer, guint header_count,
+ const char **header_names, const char **header_values)
{
SwfdecURL *url;
+ guint i;
if (swfdec_url_path_is_relative (url_string)) {
url = swfdec_url_new_relative (swfdec_player_get_base_url (player), url_string);
@@ -145,7 +147,7 @@ swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecPlayer *player,
if (!swfdec_url_has_protocol (url, "http") &&
!swfdec_url_has_protocol (url, "https")) {
SWFDEC_LOADER_CLASS (swfdec_gtk_loader_parent_class)->load (loader, player,
- url_string, buffer);
+ url_string, buffer, header_count, header_names, header_values);
} else {
SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader);
SwfdecGtkLoaderClass *klass = SWFDEC_GTK_LOADER_GET_CLASS (gtk);
@@ -153,6 +155,12 @@ swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecPlayer *player,
gtk->message = soup_message_new (buffer != NULL ? "POST" : "GET",
swfdec_url_get_url (url));
soup_message_set_flags (gtk->message, SOUP_MESSAGE_OVERWRITE_CHUNKS);
+
+ for (i = 0; i < header_count; i++) {
+ soup_message_headers_append (gtk->message->request_headers,
+ header_names[i], header_values[i]);
+ }
+
g_signal_connect (gtk->message, "got-chunk", G_CALLBACK (swfdec_gtk_loader_push), gtk);
g_signal_connect (gtk->message, "finished", G_CALLBACK (swfdec_gtk_loader_finished), gtk);
if (buffer)
diff --git a/swfdec/swfdec_as_interpret.c b/swfdec/swfdec_as_interpret.c
index bcdda37..f36cbdd 100644
--- a/swfdec/swfdec_as_interpret.c
+++ b/swfdec/swfdec_as_interpret.c
@@ -1243,8 +1243,8 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g
target = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 1));
movie = swfdec_player_get_movie_from_string (SWFDEC_PLAYER (cx), target);
if (movie != NULL) {
- swfdec_load_object_create (SWFDEC_AS_OBJECT (movie), url, buffer, NULL,
- swfdec_as_interpret_load_variables_on_finish);
+ swfdec_load_object_create (SWFDEC_AS_OBJECT (movie), url, buffer, 0,
+ NULL, NULL, NULL, swfdec_as_interpret_load_variables_on_finish);
}
} else if (internal) {
swfdec_resource_load_movie (SWFDEC_PLAYER (cx), swfdec_as_stack_peek (cx, 1),
diff --git a/swfdec/swfdec_as_strings.c b/swfdec/swfdec_as_strings.c
index 6285a6b..e93063c 100644
--- a/swfdec/swfdec_as_strings.c
+++ b/swfdec/swfdec_as_strings.c
@@ -505,5 +505,7 @@ const char swfdec_as_strings[] =
SWFDEC_AS_CONSTANT_STRING ("onChanged")
SWFDEC_AS_CONSTANT_STRING ("fullScreen")
SWFDEC_AS_CONSTANT_STRING ("onFullScreen")
+ SWFDEC_AS_CONSTANT_STRING ("_customHeaders")
+ SWFDEC_AS_CONSTANT_STRING ("Content-Type")
/* add more here */
;
diff --git a/swfdec/swfdec_file_loader.c b/swfdec/swfdec_file_loader.c
index 7f92275..c977bc8 100644
--- a/swfdec/swfdec_file_loader.c
+++ b/swfdec/swfdec_file_loader.c
@@ -39,7 +39,8 @@ G_DEFINE_TYPE (SwfdecFileLoader, swfdec_file_loader, SWFDEC_TYPE_LOADER)
static void
swfdec_file_loader_load (SwfdecLoader *loader, SwfdecPlayer *player,
- const char *url_string, SwfdecBuffer *buffer)
+ const char *url_string, SwfdecBuffer *buffer, guint header_count,
+ const char **header_names, const char **header_values)
{
SwfdecStream *stream = SWFDEC_STREAM (loader);
GError *error = NULL;
diff --git a/swfdec/swfdec_load_object.c b/swfdec/swfdec_load_object.c
index 2b15c09..afc7781 100644
--- a/swfdec/swfdec_load_object.c
+++ b/swfdec/swfdec_load_object.c
@@ -126,6 +126,7 @@ static void
swfdec_load_object_dispose (GObject *object)
{
SwfdecLoadObject *load = SWFDEC_LOAD_OBJECT (object);
+ guint i;
if (load->loader) {
swfdec_stream_set_target (SWFDEC_STREAM (load->loader), NULL);
@@ -137,6 +138,13 @@ swfdec_load_object_dispose (GObject *object)
load->buffer = NULL;
}
+ for (i = 0; i < load->header_count; i++) {
+ g_free (load->header_names[i]);
+ g_free (load->header_values[i]);
+ }
+ g_free (load->header_names);
+ g_free (load->header_values);
+
G_OBJECT_CLASS (swfdec_load_object_parent_class)->dispose (object);
}
@@ -172,7 +180,9 @@ swfdec_load_object_load (SwfdecPlayer *player, gboolean allow, gpointer obj)
return;
}
- load->loader = swfdec_player_load (player, load->url, load->buffer);
+ load->loader = swfdec_player_load_with_headers (player, load->url,
+ load->buffer, load->header_count, (const char **)load->header_names,
+ (const char **)load->header_values);
swfdec_stream_set_target (SWFDEC_STREAM (load->loader), SWFDEC_STREAM_TARGET (load));
swfdec_loader_set_data_type (load->loader, SWFDEC_LOADER_DATA_TEXT);
@@ -241,7 +251,8 @@ swfdec_load_object_mark (gpointer object, gpointer player)
void
swfdec_load_object_create (SwfdecAsObject *target, const char *url,
- SwfdecBuffer *data, SwfdecLoadObjectProgress progress,
+ SwfdecBuffer *data, guint header_count, char **header_names,
+ char **header_values, SwfdecLoadObjectProgress progress,
SwfdecLoadObjectFinish finish)
{
SwfdecPlayer *player;
@@ -249,6 +260,8 @@ swfdec_load_object_create (SwfdecAsObject *target, const char *url,
g_return_if_fail (SWFDEC_IS_AS_OBJECT (target));
g_return_if_fail (url != NULL);
+ g_return_if_fail (header_count == 0 || header_names != NULL);
+ g_return_if_fail (header_count == 0 || header_values != NULL);
g_return_if_fail (finish != NULL);
player = SWFDEC_PLAYER (target->context);
@@ -258,6 +271,9 @@ swfdec_load_object_create (SwfdecAsObject *target, const char *url,
load->target = target;
load->url = url;
load->buffer = data;
+ load->header_count = header_count;
+ load->header_names = header_names;
+ load->header_values = header_values;
load->progress = progress;
load->finish = finish;
/* get the current security */
diff --git a/swfdec/swfdec_load_object.h b/swfdec/swfdec_load_object.h
index 4e69288..c44c9be 100644
--- a/swfdec/swfdec_load_object.h
+++ b/swfdec/swfdec_load_object.h
@@ -48,6 +48,9 @@ struct _SwfdecLoadObject {
const char * url; /* GC'ed url to request */
SwfdecBuffer * buffer; /* data to send */
+ guint header_count; /* number of headers */
+ char ** header_names; /* names of headers */
+ char ** header_values; /* values of headers */
SwfdecLoader * loader; /* loader when loading or NULL */
SwfdecSandbox * sandbox; /* sandbox that inited the loading */
@@ -66,6 +69,9 @@ GType swfdec_load_object_get_type (void);
void swfdec_load_object_create (SwfdecAsObject * target,
const char * url,
SwfdecBuffer * data,
+ guint header_count,
+ char ** header_names,
+ char ** header_values,
SwfdecLoadObjectProgress progress,
SwfdecLoadObjectFinish finish);
diff --git a/swfdec/swfdec_load_object_as.c b/swfdec/swfdec_load_object_as.c
index 5a6510b..fc97b7c 100644
--- a/swfdec/swfdec_load_object_as.c
+++ b/swfdec/swfdec_load_object_as.c
@@ -74,8 +74,8 @@ swfdec_load_object_as_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
SWFDEC_AS_VALUE_SET_BOOLEAN (rval, FALSE);
SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_OBJECT, &object, "s", &url);
- swfdec_load_object_create (object, url, NULL, swfdec_load_object_on_progress,
- swfdec_load_object_on_finish);
+ swfdec_load_object_create (object, url, NULL, 0, NULL, NULL,
+ swfdec_load_object_on_progress, swfdec_load_object_on_finish);
SWFDEC_AS_VALUE_SET_INT (&val, 0);
swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR__bytesLoaded,
@@ -99,12 +99,73 @@ swfdec_load_object_as_send (SwfdecAsContext *cx, SwfdecAsObject *object,
SWFDEC_STUB ("LoadVars/XML.send");
}
+static void
+swfdec_load_object_as_get_headers (SwfdecAsObject *object, guint *header_count,
+ char ***header_names, char ***header_values)
+{
+ GPtrArray *array_names, *array_values;
+ SwfdecAsValue val;
+ SwfdecAsObject *list;
+ int i, length;
+ const char *name;
+ SwfdecAsContext *cx;
+
+ cx = object->context;
+
+ array_names = g_ptr_array_new ();
+ array_values = g_ptr_array_new ();
+
+ if (swfdec_as_object_get_variable (object, SWFDEC_AS_STR_contentType, &val))
+ {
+ g_ptr_array_add (array_names, g_strdup (SWFDEC_AS_STR_Content_Type));
+ g_ptr_array_add (array_values,
+ g_strdup (swfdec_as_value_to_string (cx, &val)));
+ }
+
+ if (!swfdec_as_object_get_variable (object, SWFDEC_AS_STR__customHeaders,
+ &val))
+ goto end;
+ if (!SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
+ SWFDEC_WARNING ("_customHeaders is not an object");
+ goto end;
+ }
+ list = SWFDEC_AS_VALUE_GET_OBJECT (&val);
+
+ swfdec_as_object_get_variable (list, SWFDEC_AS_STR_length, &val);
+ length = swfdec_as_value_to_integer (cx, &val);
+
+ /* FIXME: solve this with foreach, so it gets faster for weird cases */
+ name = NULL;
+ for (i = 0; i < length; i++) {
+ swfdec_as_object_get_variable (list, swfdec_as_integer_to_string (cx, i),
+ &val);
+ if (name == NULL) {
+ name = swfdec_as_value_to_string (cx, &val);
+ } else {
+ g_ptr_array_add (array_names, g_strdup (name));
+ g_ptr_array_add (array_values,
+ g_strdup (swfdec_as_value_to_string (cx, &val)));
+ name = NULL;
+ }
+ }
+ if (name != NULL)
+ SWFDEC_FIXME ("_customHeaders with uneven amount of elements, what to do?");
+
+end:
+ g_assert (array_names->len == array_values->len);
+ *header_count = array_names->len;
+ *header_names = (char **)g_ptr_array_free (array_names, FALSE);
+ *header_values = (char **)g_ptr_array_free (array_values, FALSE);
+}
+
SWFDEC_AS_NATIVE (301, 2, swfdec_load_object_as_sendAndLoad)
void
swfdec_load_object_as_sendAndLoad (SwfdecAsContext *cx, SwfdecAsObject *object,
guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
{
const char *url, *data, *method_string;
+ guint header_count;
+ char **header_names, **header_values;
SwfdecAsObject *target;
SwfdecAsValue val;
SwfdecBuffer *buffer;
@@ -132,8 +193,11 @@ swfdec_load_object_as_sendAndLoad (SwfdecAsContext *cx, SwfdecAsObject *object,
strlen (data));
}
- swfdec_load_object_create (target, url, buffer,
- swfdec_load_object_on_progress, swfdec_load_object_on_finish);
+ swfdec_load_object_as_get_headers (object, &header_count, &header_names,
+ &header_values);
+ swfdec_load_object_create (target, url, buffer, header_count, header_names,
+ header_values, swfdec_load_object_on_progress,
+ swfdec_load_object_on_finish);
SWFDEC_AS_VALUE_SET_INT (&val, 0);
swfdec_as_object_set_variable_and_flags (target, SWFDEC_AS_STR__bytesLoaded,
diff --git a/swfdec/swfdec_loader.h b/swfdec/swfdec_loader.h
index 1b0c272..b0e1b5e 100644
--- a/swfdec/swfdec_loader.h
+++ b/swfdec/swfdec_loader.h
@@ -67,7 +67,10 @@ struct _SwfdecLoaderClass
void (* load) (SwfdecLoader * loader,
SwfdecPlayer * player,
const char * url,
- SwfdecBuffer * buffer);
+ SwfdecBuffer * buffer,
+ guint header_count,
+ const char ** header_names,
+ const char ** header_values);
};
GType swfdec_loader_get_type (void);
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 7130445..5dbe243 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2713,19 +2713,23 @@ swfdec_player_create_url (SwfdecPlayer *player, const char *string)
}
SwfdecLoader *
-swfdec_player_load (SwfdecPlayer *player, const char *url,
- SwfdecBuffer *buffer)
+swfdec_player_load_with_headers (SwfdecPlayer *player, const char *url,
+ SwfdecBuffer *buffer, guint header_count, const char **header_names,
+ const char **header_values)
{
SwfdecLoader *loader;
SwfdecLoaderClass *klass;
g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
g_return_val_if_fail (url != NULL, NULL);
+ g_return_val_if_fail (header_count == 0 || header_names != NULL, NULL);
+ g_return_val_if_fail (header_count == 0 || header_values != NULL, NULL);
loader = g_object_new (player->priv->loader_type, NULL);
klass = SWFDEC_LOADER_GET_CLASS (loader);
g_return_val_if_fail (klass->load != NULL, NULL);
- klass->load (loader, player, url, buffer);
+ klass->load (loader, player, url, buffer, header_count, header_names,
+ header_values);
return loader;
}
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index cd31855..8391998 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -180,9 +180,14 @@ void swfdec_player_perform_actions (SwfdecPlayer * player);
swfdec_function_list_add (&(player)->priv->resource_requests, (request_func), (data), (destroy_notify))
SwfdecURL * swfdec_player_create_url (SwfdecPlayer * player,
const char * string);
-SwfdecLoader * swfdec_player_load (SwfdecPlayer * player,
+#define swfdec_player_load(player, url, buffer) \
+ swfdec_player_load_with_headers((player), (url), (buffer), 0, NULL, NULL)
+SwfdecLoader * swfdec_player_load_with_headers (SwfdecPlayer * player,
const char * url,
- SwfdecBuffer * buffer);
+ SwfdecBuffer * buffer,
+ guint header_count,
+ const char ** header_names,
+ const char ** header_values);
SwfdecAsObject *swfdec_player_get_export_class (SwfdecPlayer * player,
const char * name);
void swfdec_player_set_export_class (SwfdecPlayer * player,
commit 89502b65c6e771ba6149e367fd4b9b68caefb3e9
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Wed Jun 4 10:51:36 2008 +0300
crashfinder: Make asserts fatal and hide Swfdec's debug output by default
diff --git a/tools/crashfinder.c b/tools/crashfinder.c
index 4d8f36d..cb398ee 100644
--- a/tools/crashfinder.c
+++ b/tools/crashfinder.c
@@ -62,6 +62,10 @@ main (int argc, char **argv)
}
};
+ // catch asserts and don't spew debug output by default
+ g_log_set_always_fatal (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
+ g_setenv ("SWFDEC_DEBUG", "0", FALSE);
+
// init
swfdec_init ();
More information about the Swfdec-commits
mailing list