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?
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.