使用twisted.web实现代理服务器
简单的实现谷歌的代理:
架构就是下面这么简单。
=================
my server outside GFW | <----------------------> your browser visit my server at port 8080
=================
代码如下:
#coding=utf-8
from twisted.web import resource, server
from twisted.internet import reactor,endpoints
from twisted.python import log
import urllib2
import urllib
import sys
from twisted.web.util import Redirect
#log.startLogging(sys.stdout) def get_redirect_url(url, prefix):
if not url:
return ''
index = url.find(prefix)
if index>-1:
index2 = url.find('&sa=')
return url[index:index2]
return url class router(resource.Resource):
def getChild(self, path, request):
url = r'https://www.google.com'
if path=="":
return Index(url)
else:
new_url = str(request.uri)
new_url = get_redirect_url(new_url,'http://')
new_url = get_redirect_url(new_url,'https://')
if new_url and (new_url.find('http://')>-1 or new_url.find('https://')>-1):
return Redirect(new_url)
return Index(url+ request.uri) class Index(resource.Resource):
def __init__(self, url):
self.url = url def render_GET(self, request):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36'}
req = urllib2.Request(self.url,headers=headers)
res = urllib2.urlopen(req)
return res.read() if __name__=='__main__':
rsc = router()
f = server.Site(rsc)
endpoints.serverFromString(reactor, 'tcp:8080').listen(f)
reactor.run()
干脆做成启动任务,参考这里:http://www.cnblogs.com/Tommy-Yu/p/4105942.html.
发现一个问题,就是,神马链接都给代理了,这样不行,搜索出来的链接得丢出去。改下router的getChild的实现。否则若是你的vps计费,流量得耗光。
解决这个问题,要把链接给redirect出去。方案有两种:
- 在 getChild 中使用 twisted.web.util.Redirect
- 在 render 中使用 twisted.web.util.redirectTo
class Index(Resource):
def getChild(self, path, request):
from twisted.web.util import Redirect return Redirect('/login')
class Index(Resource):
def render(self, request):
from twisted.web.util import redirectTo
return redirectTo('/login', request)
使用twisted.web实现代理服务器的更多相关文章
- Python - twisted web 入门学习之一
原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...
- Twisted web开发教程
最近在网上看到一篇twisted web开发文章,将它实践了一下,twisted 提供基本的url路由 和 控制器,模板与模型需要外部扩展 1.目录浏览 2.get请求 3.url路由 4.接受带参数 ...
- Twisted的WEB开发
1 简介 在WEB开发中,偶尔需要对HTTP协议更多底层细节进行控制,这时的django/web.py等等显然无法满足要求,所以只好求助于Twisted了.使用Twisted进行WEB开发,其实更 ...
- twisted学习笔记No.3 Web Clients
原创博文,转载请注明出处. 这一章我们学习利用twisted建立web 客户端. twisted.web.client.getPage用来异步下载一个页面,并且返回一个deferred from tw ...
- HTTP架构介绍(1) Web服务器和代理服务器
HTTP应用协议本身是不能运行的,它需是需要架构在硬件和软件解决方案上,才能在万维网上提供高效的传输服务. 在这系列的文章中,我们将会了解到以下概念: Web服务器 代理服务器 缓存 网关.信道和中继 ...
- http twisted
Sunday, September 30th, 2007 Twisted的WEB开发 作者: gashero <harry.python@gmail.com> 目录 1 简介 2 ...
- Mina、Netty、Twisted一起学(八):HTTP服务器
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...
- Windows下配置Squid反向代理服务器
Squid是一款类Unix系统下非常流行的服务器软件,其最重要的功能就是在客户端和服务端之间建立缓存.因而Squid可以用作反向代理,部署多级缓存或者搭建CDN等,无论名称是什么,本质上都是一样的.目 ...
- 【转】Python Twisted介绍
Python Twisted介绍 作者:Jessica McKellar 原文链接 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开 ...
随机推荐
- jsp+oracle实现数据库内容以表格形式在前台显示(包含分页)
jsp+oracle实现数据库内容以表格形式在前台显示(包含分页) 在文件夹内新增list_emp.jsp 代码如下: <%@ page contentType="text/html& ...
- OC基础--成员变量的封装
一.封装的作用: 1.重用 2.不必关心具体的实现 3.面向对象三大特征之一 4.具有安全性 二.OC中成员变量的命名规范以及注意事项 1.命名规范--.成员变量都以下划线“_”开头 1)为了跟get ...
- Java设计模式-状态模式(State)
核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线.隐身.忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1.可以通过改变状 ...
- C 文件读写1
打开文件 fopen( ) 函数来创建或者打开文件,这个调用会初始化一个FILE 类型的对象. 原型 FILE *fopen( const char * filename, const char * ...
- HDU2509 Be the Winner
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Eclips将lib打入war中
在项目的属性, java build path -> Libraries -> Add library.. -> Web app Libraries .即可. 在属性中, Deplo ...
- Swift开发学习-02 变量和常量
本教程是笔者在自学IOS/Swift知识的总结,适用于通过对Objictive C编程的运用,并需要了解基于iOS程序的iPhone和iPad的程序员.做一个有bigger的’攻城狮‘,有尊严的工作, ...
- IOS基础之 (一) OC基础语法
一 OC语法 1.关键字 基本上所有关键字都是以@开头,比如: @interface , @implementation, @end, @public, @protected, @private 2. ...
- 【转】KMP算法
转载请注明来源,并包含相关链接.http://www.cnblogs.com/yjiyjige/p/3263858.html 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初 ...
- TIME_WAIT过多
Linux系统下,TCP/IP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口.当并发请求过多的时候,就会产生大量的 TIME_WAIT状态的连接,无法及时断开的话,会占用大量的 ...