Error #2032:IOError

To start with in this error I have encountered and explored is specific to ASP.NET and Flash communication using URLVariables and URLLoader.

The error was that although I could send update value to my .Net page but couldn’t receive the update back in Flash player specifically in Chrome and Opera.  To my relief the problem for Opera was resolved with their latest release of version 10.54

So the quest begin and I Google around and found the one of the best source related to Flash Errors on web which is Judah’s blog So in case you are not looking to .net related problem please go through the post and responses in that blog entry you might come across your problem related response.

I put flash.events.HTTPStatusEvent.HTTP_STATUS as suggested by Mike Chambers on that Judah’s blog that helped me to move in right direction at least. I just noticed that in Chrome I am getting status=0 whereas in Firefox or IE I was getting Status=200.

I used Wireshark as suggested in the comments by quite a few users. This post Using WireShark to sniff HTTP packets
has steps listed to help you in getting related information using Wireshark. I was able to figure out that I am receiving response from in both Chrome and Firefox but somehow Chrome is not able to read the response.

Suddenly because of my good luck ASP.Net developer has put some error in his page by mistake and i was able to see the error value in Chrome and when I asked me to send me some text in error blog itself i was able to see the value in Chrome as well.

So now it was the turn of .net code to figure out what wrong was there and we saw that the correct block has two lines after sending the values which are:

Response.Flush();
//Response.Close();

We just commented out Response.Close(); and here it is the problem is solved and we were able to see the values in all browsers. So for reference I searched around what was the problem with Response.close and here is a  post Response.End, Response.Close, and How Customer Feedback Helps Us Improve MSDN Documentation

Which clearly states that Response.close send reset packet and that’s why I was getting 0 instead of 200 and because of that Chrome was missing the values somehow.

Few other related forum questions and blog post which i have read during this problem are:

URLLoader Error #2032: Stream Error

Why is my URLLoader not dispatching when it completes?

Advertisements

Flash player with ExternalInterface call and it’s use inside form tag

This article is an update to the previous one i have written i.e. picking up domain name….
It’s a new problem i noticed while using ExternalInterface in flash file and embedding that swf file in asp.net web pages and within form tags

The problem starts when we have our flash player (with External Interface call) embedded inside a form tag that is mostly in ASP.net web pages which use runat server controls. Most of IE version 6 and IE 7 starts giving error:’try { flashplayer.SetReturnValue(__flash__toXML(window.location.hostname.toString()) ); } catch (e) { flashplayer.SetReturnValue(“”); }’ or ‘flash player id undefined’
Looking at various websites and finally on livedocs I was able to find the solution/workaround to the problem: Just add following line after your flash file embed code in which you are using any ExternalInterface call.

window.[flashplayer id used in embed code] = document.getElementById(['flash player id used in embed code']).

This will add a window level pointer to the movie so that it can be referenced directly using id/name. As this is only required in case of IE you can put condition for it’s execution only in case of IE.

Picking up the domain name where your flash file/player has been hosted

This problem was bugging me for a long time and I was not able to find the solution until recently when I dug into few internet blogs again for sometime and was able to crack the problem.

Actually this was a request that came up to me last year for tracking the IPs or domain name where our flash application/player is blogged or embedded. The only solution then I was thinking of was _root._url. But that was of no use as the flash player was being picked from our website and it was returning the URL of our website then the website where it was embedded. I even thought of getURL but it was not useful in this solution. I never worked with
ExternalInterface much at that time and never thought it will be of any use as such for me as I thought its functionality is almost like getURL so it will be same as getURL.

So I never dug deep into ExternalInterface at that time and I just thought whenever we try to send some variable to through sendAndLoadVar to our domain for tracking the visit count why not try to read the request header. Maybe request header will have the domain information in http-referrer or somewhere. But when we tried to dig deep into that we found that it’s the client ip information which we receive in the request header not the domain information so that solution was too ruled out.

This year again when I was approached for the solution I thought do some more search & research. I came across this blog of abdul qabiz; there in one thread I found some useful information and came across a mention of another website “http://www.flexpasta.com/index.php/2008/03/15/getting-url-parameters-host-name-port-in-flex-actionscript/” target=”_blank”>Flex Pasta“. There I found the solution to my problem that I can use
ExternalInterface to get this domain information and many other information variables like port or URL parameters.

So here I found the solution. I created a small code snippet to test it and see how it’s working on a different domain; I created 2 text fields on stage in AS2 file:

ActionScript 2:

import flash.external.ExternalInterface;   

try{
	txtDomain.text = ExternalInterface.call("window.location.hostname.toString");
}catch (myError:Error) {
	txtError.text = ("error: "+myError);
}

So it worked locally for me. But when I hosted this file on one website and pasted embed code in one blog, I got null as the value in the textfield. Then I tried to look into the Adobe help docs; there I found that if any error occurred it will return null. So I just tried to do some checkup on the Internet and then I found that allowScriptAccess must always be set as always; then only it will return the value.

So I am again stuck in the middle! I will be able to return the track of only those blogs, which will allow me to embed the code with allowscriptaccess as always but due to security threats many of the major blogs have already changed it; they have set it’s value as never so you can’t embed any third party swf file into these blogs with allowscriptaccess tag with value other then never. So does that mean you can’t get domain name track backs from these blogs? I tried to do try catch as you see in the above code but nothing was returned in AS2 other then null.

So I read one comment in the Abdul Qabiz blog that he got a security error back in try catch and in that string he got where it was occurred along with the swf file path. I tried that in ActionScript3/CS3 file something like this:

import flash.external.ExternalInterface;

var loc:*;
try{
	loc = ExternalInterface.call("window.location.href.toString");
}catch (e:SecurityError) {
	test.text = ("error caught: "+e);
}
txtDomain.text = String(loc);

I mentioned the variable type of loc as “*” because I read a comment from senocular on Flashkit that the variable returned by ExternalInterface.call is of type “*”. When I tried to assign that value to textfield it gave me an error: TypeError: Error #2007: Parameter text must be non-null. So there I have to typecast the variable as String to remove the error. Now when I published the file and tried that with ‘allowscriptaccess’ set to ‘never’ in embed code, I got a flash player error alert popup which said that the following swf can’t access the following html file in which it is embedded.

Now as html page is hosted on the domain for which I was looking i.e. I can parse out the domain name from that error but an alert is not something a visitor likes to see. I put that call in try catch and got the error trace which has domain name in html page reference in catch block.

Similarly if you want to do it in Flex application you can do it something like:

import flash.external.ExternalInterface;

private var dom:*;
private function init():void{
	try{
		dom = ExternalInterface.call("window.location.hostname.toString");
	}catch(e:SecurityError){
		dom = "error: " + e.toString();
	}
}

Init method can be called up on creation complete event of application.

Another problem which I came across this whole process was that during my tracing I noticed that although I can trace up external interface call in Firefox and Safari but Internet Explorer was not responding to the call. When I dug upon it a bit I found on one of the forums that specifying the flash file id in Object tag is a must to make sure your ExternalInterface call go through and return you a value. For e.g.<object classid=’clsid:d27cdb6e-ae6d-11cf-96b8-444553540000′ width=’481′ height=’402′ id=’player’>