【问题标题】:seriously simple python HTTP proxy? [duplicate]非常简单的python HTTP代理? [复制]
【发布时间】:2011-05-23 16:36:11
【问题描述】:

我到处寻找,发现数百万个 python 代理服务器,但没有一个能完全符合我的要求(我认为 :s)

我对 python 有相当多的经验,但我对 HTTP 协议的深奥秘境还是很陌生。

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

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

如果这没有多大意义,我很抱歉,因为我对我的问题的想法可能被打乱了:(

如果您能想到任何可以使我的问题更清楚的事情,请建议我添加它。 xxx

编辑:

此外,非常感谢代理处理请求、请求页面(此时如何读取/修改数据)并将其传递给原始请求者的详细过程的解释链接 xxxx

【问题讨论】:

  • 如果您想要执行的请求或响应有任何修改,您应该详细说明该处理是什么。例如。给定传递给您的 URL,您如何确定要连接的 URL? (不要说“相同”,因为那会回到你身上)。
  • 嗯,详细地说,我的意思是 URL 过滤,访问数据以获取加权字数,或者任意编辑(仍然是通用的,但只是将其作为字符串访问是真正需要的)
  • 您可能会觉得这很有用:null-byte.wonderhowto.com/how-to/…
  • 我是 proxy.py、轻量级 http、https 和 websockets 代理服务器的作者,它作为单个 Python 文件分发,没有外部依赖。 github.com/abhinavsingh/proxy.py你可能想检查它的源代码以了解内部细节,谢谢。

标签: python http proxy


【解决方案1】:

“一个非常简单的代理示例,可以连接到它,然后它自己会尝试连接到传递给它的地址。”这实际上是 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 读取的任何内容复制到响应中。

请注意,这是真正最小的。我相信它根本不处理标题。

顺便说一句:path 记录在http://docs.python.org/library/basehttpserver.html。它是在调用 do* 方法之前设置的。

【讨论】:

  • 这真是太快了,谢谢!!!!是的,对冗长的事情感到抱歉..... xx
  • 除了该页面所说的内容之外,我在想您对如何编辑数据有任何线索吗?我在想 rfile/wfile,但我不知道应该把它放在脚本中的哪个位置,如果它甚至是正确的东西 xxx
  • 对于最小的标题处理(你甚至不会得到 200 OK),添加 self.send_response(200)self.end_headers() 作为 do_GET() 的前两行。 (没有它们,ab 认为请求失败。)
  • 在 mjs 的评论顶部,我认为您最好发送一个响应标头,从 urlopen 返回的句柄中提取响应代码。此外,您最好发回带有从句柄读取的数据大小的“Content-Length”标头,以确保在客户端正确解析 HTTP tcp 流。
  • 我现在如何通过requests库使用它?我做了requests.get(url, proxies={dict with http and https keys}),在代理服务器控制台中我看到code 501, message Unsupported method ('CONNECT')
【解决方案2】:

来自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()

【讨论】:

    【解决方案3】:

    proxpy 看起来很有前途,调整请求和响应非常简单。

    【讨论】:

    • +1。如果您想要一个转发确切请求(包括标头和所有请求)的代理,但希望能够调整请求,那么您需要 ProxPy 之类的东西。
    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多