2009-10-10 2 views
1

Je cours un serveur HTTP en utilisant le cadre tordu. Est-ce que je peux "manuellement" lui demander de traiter une charge utile? Par exemple, si j'ai construit une trame Ethernet, puis-je demander au réacteur de twisted de le gérer comme s'il venait d'arriver sur ma carte réseau?Donner manuellement un paquet à traiter à la pile réseau torsadée (web)?

+0

Une trame ethernet sera traitée à un niveau beaucoup plus bas que la torsion fonctionne, donc injecter que dans le flux du réseau n'a rien à voir avec torsadé. – Amok

Répondre

2

Vous pouvez faire quelque chose comme ceci:

from twisted.web import server 
from twisted.web.resource import Resource 
from twisted.internet import reactor 
from twisted.internet.protocol import Protocol, ClientFactory 

class SomeWebThing(Resource): 
    def render_GET(self, request): 
     return "hello\n" 

class SomeClient(Protocol): 
    def dataReceived(self, data): 
     p = self.factory.site.buildProtocol(self.transport.addr) 
     p.transport = self.transport 
     p.dataReceived(data) 

class SomeClientFactory(ClientFactory): 
    protocol = SomeClient 
    def __init__(self, site): 
     self.site = site 

if __name__ == '__main__': 
    root = Resource() 
    root.putChild('thing', SomeWebThing()) 
    site = server.Site(root) 
    reactor.listenTCP(8000, site) 

    factory = SomeClientFactory(site) 
    reactor.connectTCP('localhost', 9000, factory) 

    reactor.run() 

et l'enregistrer comme simpleinjecter.py, si vous le faites alors (à partir de la ligne de commande):

echo -e "GET /thing HTTP/1.1\r\n\r\n" | nc -l 9000 # runs a server, ready to send req to first client connection 
python simpleinjecter.py 

il devrait fonctionner comme prévu, avec la demande du serveur nc sur le port 9000 est acheminée comme charge utile dans le serveur Web tordu, et la réponse revient comme prévu.

Les lignes clés se trouvent dans SomeClient.dataRecieved(). Vous aurez besoin d'un objet de transport avec les bonnes méthodes - dans l'exemple ci-dessus, je viens de voler l'objet de la connexion client. Si vous n'allez pas faire cela, j'imagine que vous devrez en créer un, car la pile voudra faire des choses comme call getPeer() dessus.

0

Quelle est la cas d'utilisation?

Peut-être que vous voulez créer votre propre à la base Datagram Protocol

, l'endroit où vous effectivement le protocole à mettre en œuvre l'analyse syntaxique et la manipulation, est la classe de DatagramProtocol. Cette classe sera généralement obtenue à partir de twisted.internet.protocol.DatagramProtocol. La plupart des gestionnaires de protocole héritent de de cette classe ou de l'un de ses enfants de commodité. La classe DatagramProtocol reçoit les datagrammes et peut les envoyer sur le réseau . Les datagrammes reçus incluent l'adresse à laquelle ils ont été envoyés , et lors de l'envoi de datagrammes, l'adresse à envoyer à doit être spécifiée.

Si vous souhaitez voir les transmissions au niveau du fil plutôt que de les injecter, installez et exécutez WireShark, the fantastic, free packet sniffer.

+0

Le cas d'utilisation: J'ai une configuration de tunnel entre deux ordinateurs. Une machine exécute un serveur Web (torsadé). Quand cette machine reçoit un paquet sur le port TCP 80 au-dessus du tunnel, je voudrais avoir tordu ce paquet de processus (comme s'il était arrivé "normalement" via le NIC de la machine). Lorsque le serveur génère des réponses TCP/IP, je souhaite les renvoyer via le tunnel. –

+0

Il est possible de configurer la redirection de port via un tunnel SSH. Au lieu d'une solution personnalisée, vous pouvez exécuter HAProxy ou similaire et l'avoir en avant les connexions à tordu sur l'autre ordinateur via le tunnel. –

Questions connexes