from time import strftime from twisted.internet import reactor from twisted.internet.defer import Deferred, DeferredList from twisted.internet.protocol import Protocol from twisted.web.client import Agent, HTTPConnectionPool from twisted.web.http_headers import Headers from twisted.internet.error import AlreadyCalled, AlreadyCancelled class BeginningPrinter(Protocol): def __init__(self,handler): self.handler=handler def dataReceived(self, received): handler(received) def connectionLost(self, reason): pass class Site(): def __init__(self,url,rest,wait,pool,md5=None,ind=None,name=None): self.url=url self.rest=rest self.wait=wait self.pool=pool self.md5=md5 self.ind=ind if ind else 0 self.name=name if name else self.url self.last_success=0 self.last_received=0 self.agent = Agent(reactor, pool=pool) self.deferred=None self.delayedCall=None def __request(self): self.deferred = self.agent.request( 'GET', self.url, Headers({'User-Agent': ['Mozilla/5.0']}) ) def again(self): print strftime('%X'),'again' try: self.deferred.cancel() except (AlreadyCalled, AlreadyCancelled) : pass try: self.delayedCall.reset(self.wait) except (AlreadyCalled, AlreadyCancelled) : self.delayedCall = reactor.callLater(self.wait, self.timeIsOff) self.__request() self.deferred.addCallback(self.gotRequest) def timeIsOff(self): print strftime('%X'),'time is off' self.again() def handleReceived(self, received): print strftime('%X'),'received: ',received def gotRequest(self, response): print strftime('%X'),'gotRequest' self.again() print 'Response code:', response.code response.deliverBody(BeginningPrinter(self.handleReceived)) def startLive(self): print strftime('%X'),'startLive' self.__request() self.deferred.addCallback(self.gotRequest) self.delayedCall = reactor.callLater(self.wait, self.timeIsOff) pool = HTTPConnectionPool(reactor) site1 = Site(url='http://wool/cgi-bin/wait.cgi',rest=3,wait=2,pool=pool) site1.startLive() reactor.run()