2010-08-07 5 views
3

J'apprends la programmation réseau en utilisant 10 en python torsadé. Dans le code ci-dessous est-il possible de détecter la requête HTTP lorsque les données sont reçues? récupérer également le nom de domaine, sous domaine, valeurs de port de cela? Rejeter si ce n'est pas des données http?Comment détecter une requête HTTP en python + tordu?

from twisted.internet import stdio, reactor, protocol 

from twisted.protocols import basic 

import re 



class DataForwardingProtocol(protocol.Protocol): 

    def _ _init_ _(self): 

     self.output = None 

     self.normalizeNewlines = False 



    def dataReceived(self, data): 

     if self.normalizeNewlines: 

      data = re.sub(r"(\r\n|\n)", "\r\n", data) 

     if self.output: 

      self.output.write(data) 



class StdioProxyProtocol(DataForwardingProtocol): 

    def connectionMade(self): 

     inputForwarder = DataForwardingProtocol() 

     inputForwarder.output = self.transport 

     inputForwarder.normalizeNewlines = True 

     stdioWrapper = stdio.StandardIO(inputForwarder) 

     self.output = stdioWrapper 

     print "Connected to server. Press ctrl-C to close connection." 



class StdioProxyFactory(protocol.ClientFactory): 

    protocol = StdioProxyProtocol 



    def clientConnectionLost(self, transport, reason): 

     reactor.stop() 



    def clientConnectionFailed(self, transport, reason): 

     print reason.getErrorMessage() 

     reactor.stop() 



if __name__ == '_ _main_ _': 

    import sys 

    if not len(sys.argv) == 3: 

     print "Usage: %s host port" % _ _file_ _ 

     sys.exit(1) 



    reactor.connectTCP(sys.argv[1], int(sys.argv[2]), StdioProxyFactory()) 

    reactor.run() 

Répondre

3

protocol.dataReceived, que vous êtes majeur, est trop faible niveau pour servir à des fins sans mémoire tampon intelligente que vous ne faites pas - par les documents que je viens de citer,

appelé chaque fois que des données sont reçues. Utilisez cette méthode pour traduire un message de niveau supérieur . Habituellement, un rappel sera effectué à la réception de chaque message de protocole complet.

Paramètres

data 

une chaîne de longueur indéterminée. S'il vous plaît garder dans esprit que vous devrez probablement tampon certaines données, comme des messages de protocole partiel (ou multiples) peuvent être reçu! Je recommande que les tests unitaires pour les protocoles appellent à cette méthode avec des tailles de blocs différentes, jusqu'à un octet à la fois.

Vous semblez ignorer complètement cette partie cruciale des documents.

Vous pouvez utiliser à la place LineReceiver.lineReceived (héritant de protocols.basic.LineReceiver, bien sûr) pour profiter du fait que les requêtes HTTP viennent en "lignes" - vous aurez toujours besoin de joindre les en-têtes qui sont envoyés en plusieurs lignes, depuis que this tutorial dit:

lignes d'en-tête en commençant par l'espace ou onglet sont en fait une partie de la ligne d'en-tête précédente, plié en plusieurs lignes pour faciliter la lecture.

Une fois que vous avez une réponse bien formaté/analysable (envisager d'étudier twisted.web's sources donc voir une façon dont il pourrait être fait),

récupérer le nom de domaine, sous-domaine, Port valeurs de cela?

maintenant (section cfr the RFC 14,23) tête Host est celui qui contient cette information.

+0

merci alex pour la réponse. Votre réponse est très utile pour un débutant comme moi.Je vais y entrer :) –

+0

pas de problème, j'ai passé beaucoup de temps à lutter contre un problème similaire et obtenir le proxy HTTP tordu travailler moi-même. Une fois que vous le comprendre, il est extrêmement lisse. – themaestro

1

Juste après ce que vous semble être d'essayer, je pense que ce qui suit serait le chemin de moindre résistance: http://twistedmatrix.com/documents/10.0.0/api/twisted.web.proxy.html

C'est la classe tordue pour la construction d'un proxy HTTP. Il vous permettra d'intercepter les demandes, de regarder la destination et de regarder l'expéditeur. Vous pouvez également regarder tous les en-têtes et le contenu qui va et vient.Vous semblez essayer de réécrire la classe HTTP Protocol et Proxy que Twisted a déjà fournie pour vous. J'espère que ça aide.

Questions connexes