用AS3来解析HTTP头部

Posted on September 28, 2010 by Fdream

AS3的URLLoader本身没有提供解析HTTP头部的功能,而在应用中,我们偶尔也会需要去解析HTTP头部,可以通过HTTP头部获取一些状态信息或者一些其他数据。

幸好AS3提供了Socket类,我们可以利用Socket来模拟HTTP请求,解析HTTP头部以及返回的内容。基本原理很简单:连接服务器的80端口或者其他web端口,向服务器发送请求头,基本上和下面类似:

GET /web/crystal/v1.1Beta01Build011/crystal_ext-min.js HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Accept-Encoding: deflate
Host: adsfile.qq.com
Connection: Keep-Alive

这里需要注意的是,由于要获取请求返回的内容,因此Accept-Encoding不能写上gzip,否则你要从gzip中解压内容啦!

在发送请求完成以后就可以等待接受数据了,接受到的是字节流,因此需要decode。AS3的ByteArray对象可以从字节流中按照一定编码读取内容。由于内容的编码不一,但是header里面是可以用UTF8读取的,因此可以先一个一个字符地读出来,到header结束后在换其他编码,比如header里面指定的编码。header结束的标记是两个换行(\r\n\r\n),因此只要独到连续两个换行就代表头部已经结束了,剩下的就是内容了,用ByteArray的readMultiByte用指定编码读取出来就可以了。

具体实现的源代码可以看这里:http://code.google.com/p/fookie/source/browse/trunk/http_loader/

其实现的类为HTTPLoader,和URLLoader类似,事件是一样的,使用方法也一样,不过返回的对象是一个HTTPResponse对象,包括status、headers和body三个属性。status是请求返回的状态码,headers包含所有返回的头部,body是返回的内容,content是body的别名属性,内容和body一样。

Posted in Flash/AS | Tagged , , , | Leave a comment | 1,791 Views |

最新版flashplayer 10.1可能存在的一个安全问题bug

Posted on August 17, 2010 by Fdream

最近flashplayer 10.1升级到了10.1.82.76,由于该版本在安全性控制方面做了许多改进,导致出现了如下的问题。

在Firefox或者Chrome浏览器下,当跨域向远程服务器请求数据时,如果URL使用的是GBK编码的,那么即使在远程服务器上有安全策略控制文件,仍然会引发安全错误。而同样的服务器,使用UTF8或者纯ASCII码做URL则不存在此问题。

也有人发现了相同的问题:http://forums.adobe.com/thread/699750?tstart=0

此问题已提交至Adobe Flash Player Bug跟踪系统中,等待响应。

因此,建议大家尽量不要使用中文名作为URL路径,能使用英文字符的尽量使用英文字符,虽然有时候是难看一点。

Posted in Flash/AS | Tagged , , , | Leave a comment | 1,316 Views |

Merpressor —— 在线自动合并、压缩JS文件

Posted on August 12, 2010 by Fdream

最近工作稍微空了点,正好又有幸见到了盛大的在线合并工具,于是一时兴起,把YUI Compressor改造了一下,写了个在线合并JS和CSS的工具,命名为Merpressor,目前已经在工作中使用了。

Mepressor分为两个部分:一部分为公网发布时所用,使用Java编写;另一部分为本地调试时所用,使用轻量和方便的PHP编写。(似乎很绕,简单地讲:Java版本用来公网部署,合并同时压缩代码;PHP版用来本地测试,并不压缩内容。)

在项目中需要合并多个js文件或者css文件时,前端开发者只需修改一个xml格式的配置文件,指定需要合并的文件,通过一定的规则访问,服务器则可自动合并多个js文件,并使用YUI Compressor压缩后返回相应内容,而本地环境下,则会自动导入xml中指定的多个js文件或者css文件,从而使得开发调试和发布一体化,真正做到无缝切换。

注意: 由于合并和压缩需要花费较大的资源和时间,因此在响应速度和并发上会表现较差,在实际使用过程中,需要配合CDN(内容分发网络,一般中大型网站都会采用)使用。当然,你也可以只是把这个工具当合并压缩工具使用。

具体详细的使用方法和安装步骤、安装包下载及源码请移步至Google Code(项目托管地址),欢迎反馈bug及提出更好的想法和建议。

在弹出窗口用POST提交数据

Posted on February 22, 2010 by Fdream

话说离上一篇日志的发表时间已有漫长的四个多月,实在是对不住读者。客观原因找一下,但是还是要实事求是:一是因为工作实在是太忙太累,无暇顾及;二是BLOG系统太慢,从前到后都需要大概,在开忙之前想修改BLOG系统来着,结果改了一点点就开始忙得不可开交了,于是也中止了。

春节休息了几天,今天上班第一天,最近混twitter混得比较多,经常要压缩URL,以前做了个书签http://is.gd/压缩,后来发现了全球最短的URL——http://to./,于是决定换API压缩。以前的API可以用GET方式提交数据压缩,但是这个却需要用POST方式提交,因此需要在弹出窗口的同时用POST提交数据。实现起来很简单:在弹出窗口中生成一个表单,把value写到对应的字段中,打开弹出窗口后再用js提交表单即可。

代码如下:

javascript: void(function() {
	var p = 'http://to./',
	u = location.href,
	x = function() {
		s = '<form name="f" id="f" action="' + p + '" method="post"><input type="text" name="url" size="9" maxlength="999" value="' + u + '" /></form><script type="text/javascript">document.f.submit();</script>';
		w = window.open('', 'W', 'toolbar=0,resizable=1,scrollbars=no,status=1,width=320,height=240');
		w.document.write(s);
		if (!w) location.href = p + '?url=' + encodeURIComponent(location.href);
	};
	if (/Firefox/.test(navigator.userAgent)) {
		setTimeout(x, 0)
	} else {
		x()
	}
})()

使用方法很简单:

1.先把当前页面加入书签,然后修改书签的属性,更改链接名称,然后更改链接地址为:

javascript:void(function(){var p='http://to./',u=location.href,x=function(){s='<form name="f" id="f" action="'+p+'" method="post"><input type="text" name="url" size="9" maxlength="999" value="'+u+'" /></form><script type="text/javascript">document.f.submit();</script>';w=window.open('','W','toolbar=0,resizable=1,scrollbars=no,status=1,width=320,height=240');w.document.write(s);if(!w)location.href=p+'?url='+encodeURIComponent(location.href);};if(/Firefox/.test(navigator.userAgent)){setTimeout(x, 0)}else{x()}})()

2.打开你要压缩URL的页面,在书签栏点击这个书签,按下Ctrl + C复制就可以了,方便吧?

Posted in Ajax Web | Tagged , | 3 Comments | 4,142 Views |

Windows 7边栏小工具-Gmail Notifier-查收Gmail

Posted on October 08, 2009 by Fdream

没想到这个工具还有几个用户,还很认证地给我发邮件提一些建议,这几天抽空做了一点小修改,同时也修复了几个小bug。

新的LOGO:

设置里面会多出一个选项:当没有新邮件的时候,点击图标是否打开Gmail页面,默认是不打开的。

下载地址:gmailnotify-0.2

———————————————–

国庆呆着无聊的时候,折腾了个Windows 7的边栏小工具,用来及时查收Gmail,可自定义收取时间间隔,预览Gmail邮件内容,有新邮件时会有提示音通知。截图如下:

呆在边栏时的状态:

预览Gmail邮件:

参数设置:

工具下载地址:

点击此处下载

Posted in Ajax Web | Tagged , , , | 18 Comments | 11,312 Views |

不安全的js写法

Posted on September 11, 2009 by Fdream

一种很常见的写法:

document.write('<scr'+'ipt src="http://a.com/b.js" type="text/javascript"></scr'+'ipt>');

直到被杀毒软件提示有恶意代码才发现这也是不安全的,汗……

那就只好改成这样了:

(function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    s.src = 'http://a.com.cn/b.js';
    document.getElementsByTagName('head')[0].appendChild(s);
})();

搜了一下,原来还有“邪恶”的eval,具体可以看这里:网马解密大讲堂——网马解密中级篇(Document.write篇)

Posted in Ajax Web | Tagged , , | Leave a comment | 3,629 Views |

全新极速CSS选择器引擎whiz

Posted on August 21, 2009 by Fdream

好不容易有些空余时间,便拿来写自己的CSS选择器引擎了,这个CSS选择器引擎的目标只有三个:

  • 速度要快
  • 代码要精简
  • 要支持CSS3的选择器。

希望通过这个,能够真正理解那些牛逼的框架中的一部分,比如jQuery,Mootools,YUI等等。花了接近三个星期的时间,大重构了三遍,从最开始的速度极低到现在的极速,每一次都是大换血。在这个过程中,我看到了那些大师写代码的境界,即使我完成了这样一个东西,代码依然很难看。要做一个CSS选择器并没有你想像的那么难,当然,也不是像玩德州扑克比赛或者是使用Word那么简单,当然也并不复杂。

大家可能看完性能测试才会有兴趣,下图是一个较全的性能测试结果,大家可以在这里测试,大家可以自己跑一跑看(由于加载的东西较多,请耐心等待一会儿再点start按钮)。

代码量目前还没达到我满意的程度,不过已经足够小了,Gzip之后仅仅只有2KB(YUICompressor压缩之后为8.61K(win NTFS)),另外,针对Firefox 3, Opera 9性能还有很大的提升空间,因为我没有使用document.getElementsByClassName。但是这些优化在我看来不再是必要的,因为Firefox的用户应该会很快升级到Firefox 3.5,Opera 10也会很快变成正式版,它们都有本地方法querySelectorAll,所以只要选择器引擎在IE6和IE7下的性能达到最高就可以了,其他的浏览器都有本地方法querySelectorAll了。

在写这个选择器引擎的过程中,更进一步了解了js性能优化的更多方法。

另外,人力有限,此选择器引擎未经过足够完整的案例测试,如果有谁有兴趣帮忙测试者,可以和我联系向我索要源代码,等稳定性达到一定程度后会全面开放源代码。

Posted in Ajax Web | Tagged , , | 22 Comments | 6,235 Views |

微软太执着,你不喜欢IE8那我就给你IE7

Posted on June 25, 2009 by Fdream

我有一个XP的系统,非常干净,IE6也一直没更新,留着原版测试CSS和JS。昨天早上开机提示要我安装更新,于是确定安装,结果蹦出个IE8的安装界面,吓了一跳。还好是第一步,可以不安装,于是点了不安装。图如下:

今天早上来开机,发现又有更新,于是继续装,结果今天蹦出个IE7的安装界面,雷啊!不过还是没装:

为什么都在Windows Update里面推荐更高版本的浏览器了,还存在这么多IE6呢?不要告诉我都和我一样,我很少用IE的,IE6就更不用了……

Posted in 乱弹IT | Tagged , , | 5 Comments | 3,987 Views |

背景图片千万不要gzip压缩,尤其是PNG

Posted on June 18, 2009 by Fdream

我们网站的静态资源(css、js和背景图片)和web应用程序是分开部署的,几乎所有的静态资源都部署在同一个应用下。最开始的网站很简单,对所有的静态资源都进行了gzip,包括所有的css,js,图片,flash等等,也一直相安无事。

直到……直到有一天用了png做背景图片,并且上传到服务器进行部署,发现在很多IE6都会在这个页面卡死,无法动弹,出事的几率非常的高。但是在内网部署的没有任何问题,那问题就只能比较内网和公网的服务器环境了。观察HTTP请求头部是个不错的方法,很快锁定是由于gzip的png引起的。内网服务器加上gzip测试,果然如此。

其实对图片等文件进行gzip是完全没有必要的,原因很简单:在web里面用作背景的图片99%以上都是gif或者jpg或者png,这些格式本来就是压缩过的,再用gzip对他们进行压缩只是徒增服务器负担而已。

Posted in Ajax Web | Tagged , , | 2 Comments | 4,193 Views |

更新Twitter的几种方法

Posted on June 03, 2009 by Fdream

万恶的GFW,只要“国际互联网”还没有完全变成“国际不联网”,更新twitter的方法总是有的,目前知道的几个方式:

1.用Gmail更新

如果你有Gmail,请登录你的Gmail,点击“settings”(设置),如果你是中文版的Gmail,需要在“常规”选项卡里面更改显示语言为英语。切换到“Gadgets”选项,在“Add a gadget by its URL:”下面的文本框中输入下面的地址:

http://twittergadget.appspot.com/gadget/gadget-gmail.xml

然后点击“Add”按钮,在左侧就可以看到“Twitter”了,使用你的Twitter帐号登录就可以了。

2.代理网站

目前发现比较好的网站有这几个:

3.设代理服务器

这里有一些翻墙代理:

http://www.39proxy.com/ip.html

Posted in 乱弹IT | Tagged , | 4 Comments | 2,982 Views |