2010-12-10 59 views
22

我已经看到无处不在,发现数以百万计的蟒蛇代理服务器,但没有做正是我想(我认为:s)认真简单的python HTTP代理?

我一直有相当多的python经验,但我很新HTTP协议的黑暗秘密世界。

我认为可能会有用的将是一个非常简单的代理示例,可以连接到并将自己尝试连接到传递给它的地址。

另外,我认为让我感到困惑的是隐藏的东西在做什么,例如如果该类从BaseHTTPServer.BaseHTTPRequestHandler继承,那么当请求一个页面时究竟发生了什么,就像我在许多例子中发现的那样,没有引用路径变量,然后突然地poof! self.path用于一个函数中。即时通讯假设它已被继承,但它如何最终使用的路径?

我很抱歉,如果这并没有多大意义,因为我对我的问题的想法可能是炒:(

如果你能想到的任何东西这将使我的问题更加清楚,请,请建议我加入。 XXX

编辑:

另外,链接到通过该代理处理请求的详细过程的交代,请求该页面(如何读/在这一点修改数据),并把它传递给原来的请求者将不胜感激xxxx

+0

如果您要执行的请求或响应有任何修改,则应详细说明该处理的内容。例如。鉴于传递给你的URL,你如何确定你想连接的URL? (不要说“一样”,因为那会回到你身边)。 – 2010-12-10 20:09:45

+0

嗯,详细说明,我的意思是URL过滤,访问数据的加权字数,或者可以任意编辑(仍然一般,但只需访问它作为一个字符串是真的需要) – jma 2011-01-12 18:22:58

回答

26

“一个非常简单的代理示例,可以连接到它,然后自己尝试连接到传递给它的地址。”这实际上是HTTP代理的定义。

有一个真的简单的代理这里例如:http://effbot.org/librarybook/simplehttpserver.htm

它的核心就是3行:

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_GET(self): 
     self.copyfile(urllib.urlopen(self.path), self.wfile) 

所以这是一个SimpleHTTPRequestHandler,在响应GET请求,将打开路径中的URL(对代理的请求通常看起来像“GET http://example.com/”,不像“GET /index.html”)。然后它只是将从该URL读取的任何内容复制到响应中。

注意这是真的是最小。我相信它根本不涉及标题。

BTW:path记录在http://docs.python.org/library/basehttpserver.html。它在调用方法do*之前设置。

+0

这是惊人的快速感谢您!!!!对不起,这个页面说,我想你是否有任何线索如何编辑数据的longwindedness ..... xx – jma 2010-12-10 19:43:04

+0

?我想rfile/wfile,但我不知道这应该放在一个脚本,如果它甚至是正确的事情xxx – jma 2010-12-10 19:50:15

+2

为了最小的头处理(你甚至没有得到200 OK),添加'self .send_response(200)'和'self.end_headers()'作为'do_GET()'的前两行。 (如果没有他们,'ab'认为请求失败。) – mjs 2011-02-13 14:11:17

11

twisted维基

from twisted.web import proxy, http 
from twisted.internet import reactor 
from twisted.python import log 
import sys 
log.startLogging(sys.stdout) 

class ProxyFactory(http.HTTPFactory): 
    protocol = proxy.Proxy 

reactor.listenTCP(8080, ProxyFactory()) 
reactor.run() 
4

proxpy看起来相当有前途的,这是非常简单的调整请求和响应。

+2

+1。如果你想要一个转发确切请求的代理(包括头文件和全部),但希望能够调整请求,那么你需要类似ProxPy的东西。 – 2014-03-18 02:44:46