обработчик http на python

Мне нужно что-то вроде BaseHTTPRequestHandler, но мне это не нужно. привязать к любым сокетам; Я хочу сам обрабатывать необработанные HTTP-данные к нему и от него. Есть ли хороший способ сделать это на Python?

Чтобы прояснить, мне нужен класс, который получает необработанные данные TCP от Python (НЕ сокет), обрабатывает их и возвращает данные TCP в качестве ответа (снова на python). Таким образом, этот класс будет обрабатывать TCP-квитирование и будет иметь методы, которые переопределяют то, что я отправляю по HTTP GET и POST, например do_GET и do_POST. Итак, мне нужно что-то вроде инфраструктуры сервера, которая уже существует, за исключением того, что я хочу передавать все необработанные TCP-пакеты в python, а не через сокеты операционной системы.


person Alex    schedule 15.12.2009    source источник


Ответы (1)


BaseHTTPRequestHandler происходит от StreamRequestHandler, который в основном читает из файла self.rfile и записывает в self.wfile, поэтому вы можете получить класс из 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>
person Anurag Uniyal    schedule 15.12.2009
comment
Спасибо за это. Однако я действительно хочу передать ему данные RAW TCP и получить ответ необработанных данных TCP. - person Alex; 15.12.2009
comment
почему бы вам не написать свой собственный tcp-сервер, twisted (twistedmatrix.com) может помочь или может быть ответом на это stackoverflow.com/questions/1581087/ - person Anurag Uniyal; 16.12.2009
comment
также см. secdev.org/projects/scapy/doc/introduction. html? highlight = syn - person Anurag Uniyal; 16.12.2009
comment
Это действительно "Total Wowness" - person Gearoid Murphy; 10.01.2013
comment
@AnuragUniyal, исправлена ​​небольшая опечатка. Спасибо за код. - person Uri; 05.05.2014