2009-12-15 5 views
4

어떤 소켓에 바인드하고 싶지 않다는 점을 제외하면 BaseHTTPRequestHandler과 같은 것을 원한다. 원시 HTTP 데이터를 직접 처리하고 싶습니다. 파이썬에서이 작업을 수행 할 수있는 좋은 방법이 있습니까?파이썬 http 핸들러

Clarify하려면 Python (소켓이 아님)에서 원시 TCP 데이터를 수신하고 처리하고 응답으로 TCP 데이터를 반환하는 클래스를 원합니다 (Python에 다시). 그래서이 클래스는 TCP 핸드 쉐이킹을 처리 할 것이고 do_GETdo_POST과 같이 HTTP GET과 POST에서 보내는 것을 오버라이드하는 메소드를 갖게 될 것입니다. 따라서, 나는 이미 존재하는 서버 인프라와 같은 것을 원한다. 단, 모든 원시 TCP 패킷을 파이썬으로 전달하고 운영 체제 소켓을 통해 전달하고 싶지는 않다.

답변

4

BaseHTTPRequestHandler는 기본적으로 파일 self.rfile에서 읽고 self.wfile에 기록 StreamRequestHandler에서 유래, 그래서 당신은 BaseHTTPRequestHandler에서 클래스를 파생하고, 예를 들어 자신의 rfile과에 WFile를 제공 ​​할 수 있습니다

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) 

출력 : 이것에 대한

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

감사합니다. 그러나, 나는 진짜로 그것에게 원시 TCP 데이터를주고 원시 TCP 데이터 응답을 되찾고 싶다. – Alex

+1

트위스티드 (http://twistedmatrix.com/)가 도움을 줄 수도 있고 이에 대한 답변 일 수도 있습니다. http://stackoverflow.com/questions/1581087/python-tcp-stack-implementation –

+0

도 http://www.secdev.org/projects/scapy/doc/introduction.html?highlight=syn을 참조하십시오. –