2013-04-10

修改GoAgent客户端以支持Mega


为了能用来访问Mega,对GoAgent客户端代码做了略微的修改。不过首先要说明一下为什么会有这个修改。

Mega是个总部位于New Zealand的网盘服务。服务器当然全世界都有,但至少在我这边ping值不好。严重的时候600ms以上,并且丢包。这样的话,不管本地有多少带宽,实际上也是不可用的。总不可能花上一整天的工夫来传一个ISO吧。
开着VPN会快,但流量和费用都是问题。于是很自然地想到了是否可以通过GoAgent之类的GAE代理来访问。Google服务器与Mega之间的带宽应该是不成问题的,而Google服务器与我之间的速度也是我可以在一定程度上控制的。不过测试下来发现GoAgent不支持OPTIONS这种HTTP Method,而且这个局限性是GAE导致的。GAE只支持GET/POST/HEAD/POST/DELETE这五种HTTP Method。偏偏Mega在登录和上传下载的时候都会发OPTIONS请求,于是这个方案一度被搁置了。
后来Mega的速度进一步下降,有时候一整天都传不完一个100M的文件。于是这个方案又被我拿出来考虑。这次我准备绕开服务端的限制,直接从客户端下手。OPTIONS请求涉及的数据量是很小的,文件传输用到的CONNECT之类才是主要的带宽压力。因此可以让客户端在遇到GAE服务器无法处理的HTTP请求时,直接将其发到目标服务器。由于Mega目前还没有被GFW给IP黑洞,因此应该可以在一种“混合模式”下被通过GoAgent访问到。

下面介绍一下修改方法,以GoAgent 2.1.15版(2.1.17还需要服务端改动才行)为例:

首先在local/proxy.py中找到这两行:
"""rules match algorithm, need_forward= True or False"""
need_forward = False
第一行是注释。而下面这个need_forward,就是用来控制是否把一个请求直接送出(FWD),而不是送去GAE服务器进行中转。

在后面的if语句前,加入这样的内容:
if self.method != 'GET' and self.method != 'POST' and self.method != 'HEAD' and self.method != 'PUT' and self.method != 'DELETE':
    if host not in http.dns:
        http.dns[host] = list(set(http.dns_resolve(host)))
    need_forward = True
非Python程序员也应该很容易读懂这段代码,不过要提醒一下:Python中缩进是很关键的,改代码时一定要用空格正确地缩进。
最后,别忘了把下面那个原来的if改成elif。

这样改过之后的GoAgent客户端,在遇到GAE服务端不能处理的那些HTTP请求类型时,就会把它们直接发到目标服务器上。
从理论上讲,这个小修改不会对GoAgent的翻墙能力有任何的增加,但可以让它具有更大的适用范围。一些原来不能用GoAgent访问的站点(比如上面提到的Mega),现在可以用它来访问了。GAE的流量按天计算(VPN一般按月,VPS也是)。并且因为可以使用多个GAE账号,因此流量基本上是免费且无限的。Mega那50GB的大空间,终于具有一定的可用性了。

没有评论:

发表评论