[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