2010-01-22 12 views
25

httplib (ahora http.client) y todos los amigos tienen conn.getresponse() y una clase HTTPResponse, pero las operaciones del lado del servidor de conn.getrequest() y una clase HTTPRequest parecen ser deficientes.¿Python tiene un módulo para analizar solicitudes y respuestas HTTP?

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

Básicamente lo que quiero es BaseHTTPRequestHandler # parse_request para que sea un método estático que devuelve un objeto HTTPRequest en lugar de rellenar las variables miembro.

Respuesta

2

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.

2

Probablemente encuentre WebOb útil. Frameworks como Pylons, Turbogears y Bfg lo usan como parte de su api. Sin embargo, opera bajo el supuesto de que usted está trabajando bajo WSGI.

43

Jeff, para permitir el análisis creo una pequeña subclase de nueve línea del controlador de solicitudes HTTP de 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 disfrutar de una cadena con el texto de una petición HTTP dentro y analizarlo instanciándolo 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')" 
+0

esto, combinado con http://stackoverflow.com/questions/5975952/how-to-extract-http-message-body-in-basehttprequesthandler-do-post es útil para analizar su propio HTTPRequest . – Joe

Cuestiones relacionadas