2

我正在使用 python twisted 模块来拦截标头。我有以下脚本:

from twisted.web import proxy, http
from twisted.internet import reactor

g_port = 8080 #port for listening
g_request = () # action, params, method

class akaProxy(proxy.Proxy):

    def dataReceived(self, data):

        action = None
        params = None
        method = None
        global g_request

        headers = data.split("\n")
        request = headers[0].split(" ")
        params = headers[len(headers)-1]

        method = request[0].lower()
        action = request[1].lower()

        print method, action

        return proxy.Proxy.dataReceived(self, data)

class ProxyFactory(http.HTTPFactory):
    protocol = akaProxy


factory = ProxyFactory()
reactor.listenTCP(g_port, factory)
reactor.run()

当我使用 web 浏览器的 localproxy 运行它时(这个 URL)给我这个错误:

Unhandled Error
Traceback (most recent call last):
  File "test2.py", line 33, in <module>
    reactor.run()
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1169, in run
    self.mainLoop()
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1181, in mainLoop
    self.doIteration(t)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/pollreactor.py", line 167, in doPoll
    log.callWithLogger(selectable, _drdw, selectable, fd, event)
--- <exception caught here> ---
  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 84, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 69, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 599, in _doReadOrWrite
    self._disconnectSelectable(selectable, why, inRead)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 260, in _disconnectSelectable
    selectable.readConnectionLost(f)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 257, in readConnectionLost
    self.connectionLost(reason)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 433, in connectionLost
    Connection.connectionLost(self, reason)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 277, in connectionLost
    protocol.connectionLost(reason)
  File "/usr/lib/python2.7/dist-packages/twisted/web/http.py", line 455, in connectionLost
    self.handleResponseEnd()
  File "/usr/lib/python2.7/dist-packages/twisted/web/proxy.py", line 88, in handleResponseEnd
    self.father.finish()
  File "/usr/lib/python2.7/dist-packages/twisted/web/http.py", line 866, in finish
    "Request.finish called on a request after its connection was lost; "
exceptions.RuntimeError: Request.finish called on a request after its connection was lost; use Request.notifyFinish to keep track of this.

但它继续工作,谁能解释这个错误,我该如何解决?

4

1 回答 1

1

这条消息出现在它所描述的情况下:您有一些处理 http 请求的代码,并且请求的finish方法没有被调用(无论出于何种原因),直到 http 连接丢失之后(这意味着现在无法发送结果给请求者)。

你可能不关心这种情况的发生。如果你不这样做,那么你应该在你的代码中做一些事情来防止Request.finish当你的请求_disconnected属性为真时调用该方法。那,或者只是忽略错误。

于 2012-05-24T16:25:51.327 回答