【问题标题】:Twisted Web Proxy扭曲的网络代理
【发布时间】:2016-06-15 04:52:40
【问题描述】:

我一直在运行这段代码(来自:http://blog.somethingaboutcode.com/?p=155):

from twisted.internet import reactor
from twisted.web import http
from twisted.web.proxy import Proxy, ProxyRequest, ProxyClientFactory, ProxyClient
from ImageFile import Parser
from StringIO import StringIO

class InterceptingProxyClient(ProxyClient):
    def __init__(self, *args, **kwargs):
        ProxyClient.__init__(self, *args, **kwargs)
        self.image_parser = None

    def handleHeader(self, key, value):
        if key == "Content-Type" and value in ["image/jpeg", "image/gif", "image/png"]:
            self.image_parser = Parser()
        if key == "Content-Length" and self.image_parser:
            pass
        else:
            ProxyClient.handleHeader(self, key, value)

    def handleEndHeaders(self):
        if self.image_parser:
            pass #Need to calculate and send Content-Length first
        else:
            ProxyClient.handleEndHeaders(self)

    def handleResponsePart(self, buffer):
        print buffer
        if self.image_parser:
            self.image_parser.feed(buffer)
        else:
            ProxyClient.handleResponsePart(self, buffer)

    def handleResponseEnd(self):
        if self.image_parser:
            image = self.image_parser.close()
            try:
                format = image.format
                image = image.rotate(180)
                s = StringIO()
                image.save(s, format)
                buffer = s.getvalue()
            except:
                buffer = ""
            ProxyClient.handleHeader(self, "Content-Length", len(buffer))
            ProxyClient.handleEndHeaders(self)
            ProxyClient.handleResponsePart(self, buffer)
        ProxyClient.handleResponseEnd(self)

class InterceptingProxyClientFactory(ProxyClientFactory):
    protocol = InterceptingProxyClient

class InterceptingProxyRequest(ProxyRequest):
    protocols = {'http': InterceptingProxyClientFactory}
    ports = {"http" : 80}

class InterceptingProxy(Proxy):
    requestFactory = InterceptingProxyRequest

factory = http.HTTPFactory()
factory.protocol = InterceptingProxy

reactor.listenTCP(8000, factory)
reactor.run()

每当我得到这个并转到 127.0.0.1:8000 时,我都会得到这个:

Traceback (most recent call last):
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\log.py",
line 84, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\log.py",
line 69, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\context.p
y", line 59, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\context.p
y", line 37, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\internet\selectr
eactor.py", line 146, in _doReadOrWrite
    why = getattr(selectable, method)()
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\internet\tcp.py"
, line 460, in doRead
    return self.protocol.dataReceived(data)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\protocols\basic.
py", line 251, in dataReceived
    why = self.lineReceived(line)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li
ne 1573, in lineReceived
    self.allContentReceived()
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li
ne 1641, in allContentReceived
    req.requestReceived(command, path, version)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li
ne 807, in requestReceived
    self.process()
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\proxy.py", l
ine 147, in process
    port = self.ports[protocol]
exceptions.KeyError: ''

每当我在 localhost:8000 上设置 firefox 或 chrome 或 opera 使用代理时,都没有与代理建立连接(我无法再连接到任何页面,尽管这可能是因为它没有连接到代理)。


好的,它仍然失败,当我将 firefox 设置为在 localhost:8000 使用代理并且不直接从 Web 浏览器访问代理(例如通过在 firefox 的地址栏中键入 localhost:8000 时),我得到了这个输出)

2010-08-04 12:31:18-0400 [-] Log opened.
2010-08-04 12:31:29-0400 [-] twisted.web.http.HTTPFactory starting on 8000
2010-08-04 12:31:29-0400 [-] Starting factory <twisted.web.http.HTTPFactory inst
ance at 0x010B3EE0>
2010-08-04 12:33:55-0400 [-] Received SIGINT, shutting down.
2010-08-04 12:33:55-0400 [twisted.web.http.HTTPFactory] (Port 8000 Closed)
2010-08-04 12:33:55-0400 [twisted.web.http.HTTPFactory] Stopping factory <twiste
d.web.http.HTTPFactory instance at 0x010B3EE0>
2010-08-04 12:33:55-0400 [-] Main loop terminated.

但是,当我直接访问代理时,我得到了关键错误。

我不能嗅探; Wireshark 似乎没有嗅探本地主机流量,如果我使用 fiddler 2,它会将自己设置为代理(因此我不再使用我的代理服务器)然后工作(因为它使用 fiddler 2 的代理)。

【问题讨论】:

  • 只是格式方面的建议:不要使用 [code] 标签。文本前需要 4 个空格才能成为代码。您可以在此处复制+粘贴,选择并点击框上方带有 [1010101] 的按钮。它会自动为您完成 4 个空格。

标签: python twisted twisted.web


【解决方案1】:

当您直接连接时看到的KeyError 异常是由于对代理的请求必须包含绝对 URL 而不是相对 URL。如果您的浏览器不知道它正在与代理通信,它将请求一个类似/foo/bar 的 URL。如果它确实知道它正在与代理通信,它将改为请求类似http://example.com/foo/bar 的内容。 http://example.com/ 部分很重要,因为它是代理知道应该触发和检索什么的唯一方法。

至于为什么 Firefox、Chrome 和 Opera 都不会在您配置后连接到代理,这有点难以解释。确保您正在配置“HTTP 代理”,而不是支持的任何其他类型的代理。仔细检查后,您可能需要使用 Wireshark 之类的工具来更好地了解网络层发生的情况。

有可能确实是与代理建立了连接,但出现了其他问题,导致它们无法完成。在这种情况下,如果不启用日志记录,您可能无法仅通过查看代理的输出来判断代理正在接收连接。要启用日志记录,请尝试:

from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)

【讨论】:

  • 已修复,代理设置错误;将 ip 地址设置为 192.x.x.x 或 10.x.x.x 或其他任何值,而不是 127.0.0.1 或 localhost
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多