twisted protocol Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
blauschleiche
User
Beiträge: 2
Registriert: Mittwoch 13. Oktober 2010, 09:32

Hallo liebe Gemeinde,

bevor ich wahnsinnig werde, suche ich hier um Hilfe. Kann mit jemand erklären warum im meinem Script handleHeader und handleEndHeaders nie aufgerufen werden? handleHeader sollte doch mit jedem empfangenen Header aufgerufen werden.

Code: Alles auswählen

#!/usr/bin/env python
from twisted.internet import reactor, protocol
from twisted.web import client


def processResult(page):
	print "I got some data", repr(page)
	reactor.callLater(0.1, reactor.stop)
	
def dealWithError(err):
	print err.getErrorMessage()
	reactor.callLater(0.1, reactor.stop)

class testproto(client.HTTPPageGetter):
	
	def connectionMade(self):
		self.header_received = False
		method = getattr(self.factory, 'method', 'GET')
		self.sendCommand(method, self.factory.path)
		self.sendHeader('Host', self.factory.headers.get("host", self.factory.host))
		self.sendHeader('User-Agent', self.factory.agent)
		self.endHeaders()

	def handleEndHeaders(self):
		self.header_received = True
		print "header"

	def handleHeader(self,key,value):
		print key

	def dataReceived(self,bytes):
		#if self.header_received == True:
		#
			print bytes


class ProxyClientFactory(client.HTTPClientFactory):
	protocol = testproto
	
	def setURL(self, url):
		client.HTTPClientFactory.setURL(self, url)
		self.path = url

	def buildProtocol(self,addr):
		proto = protocol.ClientFactory.buildProtocol(self, addr)
		return proto

def main():
	factory = ProxyClientFactory('http://www.google.com')
	factory.deferred.addCallback(processResult)
	factory.deferred.addErrback(dealWithError)
	
	
	reactor.connectTCP('proxy', 8118, factory)
	reactor.run()
		

if __name__ == '__main__':
	main()
mjacob
User
Beiträge: 7
Registriert: Dienstag 30. Dezember 2008, 20:09

Hallo,
in Deiner von HTTPPageGetter abgeleiteten Klasse hast du dataReceived überschrieben. So kann HTTPPageGetter die Daten nicht verarbeiten. Du musst die überschriebene Methode auch aufrufen. So zum Beispiel:

Code: Alles auswählen

def dataReceived(self, bytes):
    print bytes
    client.HTTPPageGetter.dataReceived(self, bytes)
blauschleiche
User
Beiträge: 2
Registriert: Mittwoch 13. Oktober 2010, 09:32

Hi und vielen Dank für deine Antwort,

du hast natürlich Recht und genauso funktioniert es. Leider scheint das nirgends in der Dokumentation zu stehen. Bzw. ich habe das nicht gefunden. Die dataReceived verteilt die Aufrufe dann weiter, das habe ich aber nicht gewusst.
MfG
Antworten