2009-12-15 10 views
4

Je veux quelque chose comme BaseHTTPRequestHandler, sauf que je ne veux pas se lier à des prises de courant; Je veux gérer les données HTTP brutes de et vers moi-même. Y at-il un bon moyen que je peux le faire en Python?python gestionnaire http

Pour clarifier les choses, je veux une classe qui reçoit des données TCP brutes de Python (pas une prise), traite et renvoie les données TCP comme une réponse (à python nouveau). Donc, cette classe se chargera handshake TCP, et avoir des méthodes qui prévalent sur ce que j'envoie sur HTTP GET et POST, comme do_GET et do_POST. Donc, je veux quelque chose comme l'infrastructure de serveur qui existe déjà, sauf que je veux passer tous les paquets TCP bruts en python et non par des prises de système d'exploitation.

Répondre

4

BaseHTTPRequestHandler dérive de StreamRequestHandler, qui se lit essentiellement de fichier self.rfile et écrit à self.wfile, afin que vous puissiez dériver une classe de BaseHTTPRequestHandler et fournir votre propre rfile et wfile par exemple

import StringIO 
from BaseHTTPServer import BaseHTTPRequestHandler 

class MyHandler(BaseHTTPRequestHandler): 

    def __init__(self, inText, outFile): 
     self.rfile = StringIO.StringIO(inText) 
     self.wfile = outFile 
     BaseHTTPRequestHandler.__init__(self, "", "", "") 

    def setup(self): 
     pass 

    def handle(self): 
     BaseHTTPRequestHandler.handle(self) 

    def finish(self): 
     BaseHTTPRequestHandler.finish(self) 

    def address_string(self): 
     return "dummy_server" 

    def do_GET(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
     self.wfile.write("<html><head><title>WoW</title></head>") 
     self.wfile.write("<body><p>This is a Total Wowness</p>") 
     self.wfile.write("</body></html>") 

outFile = StringIO.StringIO() 

handler = MyHandler("GET /wow HTTP/1.1", outFile) 
print ''.join(outFile.buflist) 

Sortie:

dummy_server - - [15/Dec/2009 19:22:24] "GET /wow HTTP/1.1" 200 - 
HTTP/1.0 200 OK 
Server: BaseHTTP/0.3 Python/2.5.1 
Date: Tue, 15 Dec 2009 13:52:24 GMT 
Content-type: text/html 

<html><head><title>WoW</title></head><body><p>This is a Total Wowness</p></body></html> 
+0

Merci pour cela. Cependant, je veux vraiment lui donner des données RAW TCP, et récupérer la réponse brute des données TCP. – Alex

+1

pourquoi ne pas écrire votre propre serveur tcp, tordu (http://twistedmatrix.com/) pourrait aider ou peut-être répondre à cette http://stackoverflow.com/questions/1581087/python-tcp-stack-implementation –

+0

voir aussi http://www.secdev.org/projects/scapy/doc/introduction.html?highlight=syn –