twisted http server error

2.6k Views Asked by At

I am using python twisted module to intercept headers. I have the following script:

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

When I run it using localproxy for web browser (this URL) give me this error:

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.

But it continues working, can anyone explain the error and how can I fix it?

1

There are 1 best solutions below

3
On BEST ANSWER

This message appears in situations just like it describes: you have some code that processes http requests, and the Request's finish method didn't get called (for whatever reason) until after the http connection was lost (meaning there is now no way to send the results to the requester).

You may not care about that happening. If you don't, then you should do something in your code to keep the Request.finish method from being called when your request's _disconnected attribute is true. That, or just ignore the error.