分类: Python/Ruby
2013-01-17 15:41:31
由于flash的安全机制,如果需要访问第三方网站的资源,则需要第三方网站的允许,这就是policy server的作用。
Policy server的原理和协议
Policy server是TCP协议上的echo server, 协议非常简单:
1. 客户端以socket方式向服务器端发送请求, 请求为明文的xml字符串, 并以”\0”结尾: "
2. 服务端收到该字符串返回后以回复一个xml(同样以”\0”结尾),
SYSTEM "/xml/dtds/cross-domain-policy.dtd">
返回值中
1. domain代表来自哪些domain的请求被允许从flash客户端中发出. 例如: 限制了domain=”baidu.com”, 那么从浏览器访问youku.com加载到的flash就不可以向该server发送请求(flash 客户端就会限制)
2. to-ports代表flash 客户端可以访问本server的哪些端口, 例如: 限制了to-ports=”80”, 那么flash客户端就会限制访问该服务器除80外的所有端口, ‘*’意味着不对client设置任何限制.
3. 一般来说上述两个配置适合大部分应用, 更多配置请参考: http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.htm
既然协议及其简单,把Twisted的Echo例子稍加修改即可。
但我这里使用的是Twisted Application的方式运行,可以用twistd脚本来执行的。
好了,废话不多说,直接上代码:
#!/usr/bin/env python from twisted.application import internet, service from twisted.internet import reactor, protocol port = 843 xml = '''\0''' class Policy(protocol.Protocol): def dataReceived(self, data): if data[-1] != '\0': return if data == ' \0': self.transport.write(xml) self.transport.loseConnection() class PolicyFactory(protocol.ServerFactory): protocol = Policy factory = PolicyFactory() application = service.Application("Policy Server") policyserver = internet.TCPServer(port, factory) policyserver.setServiceParent(application)
sudo twistd -y policysrv.py
我晕,这编辑器,输入时还有\0, 显示出来就没有了。代码如图,如要拷贝,请将对应的\0添加上.