¿Tiene Python un módulo para analizar las solicitudes y respuestas HTTP?

httplib (ahora http.client) y todos sus amigos tienen conn.getresponse () y una clase HTTPResponse, pero las operaciones del lado del servidor de conn.getrequest () y una clase HTTPRequest parecen faltar.

Entiendo que BaseHTTPServer y BaseHTTPRequestHandler pueden realizar esta funcionalidad, pero no exponen estos métodos para su uso fuera del módulo.

Esencialmente, lo que quiero es que BaseHTTPRequestHandler # parse_request sea un método estático que devuelva un objeto HTTPRequest en lugar de rellenar las variables miembro.

Jeff, para habilitar el análisis, creo una pequeña subclase de nueve líneas del controlador de solicitudes HTTP base:

from BaseHTTPServer import BaseHTTPRequestHandler from StringIO import StringIO class HTTPRequest(BaseHTTPRequestHandler): def __init__(self, request_text): self.rfile = StringIO(request_text) self.raw_requestline = self.rfile.readline() self.error_code = self.error_message = None self.parse_request() def send_error(self, code, message): self.error_code = code self.error_message = message 

Ahora puede tomar una cadena con el texto de una solicitud HTTP dentro y analizarla al crear una instancia de esta clase:

 # Simply instantiate this class with the request text request = HTTPRequest(request_text) print request.error_code # None (check this first) print request.command # "GET" print request.path # "/who/ken/trust.html" print request.request_version # "HTTP/1.1" print len(request.headers) # 3 print request.headers.keys() # ['accept-charset', 'host', 'accept'] print request.headers['host'] # "cm.bell-labs.com" # Parsing can result in an error code and message request = HTTPRequest('GET\r\nHeader: Value\r\n\r\n') print request.error_code # 400 print request.error_message # "Bad request syntax ('GET')" 

Para el procesamiento del lado del servidor desea ver algo como wsgiref .

El estándar WSGI analiza la solicitud en un diccionario simple con todos los encabezados y elementos relevantes.

Probablemente encuentre útil WebOb . Marcos como Pylons, Turbogears y Bfg lo usan como parte de su API. Sin embargo, funciona bajo el supuesto de que está trabajando bajo WSGI.