2012-09-27 20 views
5

Estoy escribiendo un simple SocketServer.TCPServer controlador de solicitud (StreamRequestHandler) que capturará la solicitud, junto con los encabezados y el cuerpo del mensaje. Esto es para simular un servidor HTTP que podemos usar para probar.Python TPCServer rfile.read bloques

No tengo problemas para tomar la línea de solicitud o los encabezados.

Si trato de obtener más del rfile que existe, el código bloquea. ¿Cómo puedo obtener todo el cuerpo de la solicitud sin saber su tamaño? En otras palabras, no tengo un encabezado Content-Size.

He aquí un fragmento de lo que tengo ahora:

def _read_request_line(self): 
    server.request_line = self.rfile.readline().rstrip('\r\n') 

def _read_headers(self): 
    headers = [] 
    for line in self.rfile: 
     line = line.rstrip('\r\n') 
     if not line: 
      break 
     parts = line.split(':', 1) 
     header = (parts[0].strip(), parts[0].strip()) 
     headers.append(header) 
    server.request_headers = headers 

def _read_content(self): 
    server.request_content = self.rfile.read() # blocks 
+0

Consulte la sección sobre [sockets no bloqueantes] (http://docs.python.org/howto/sockets.html#non-blocking-sockets). –

+2

Con HTTP, las opciones son usar el encabezado Content-Length (si hay un cuerpo) o usar codificación de transferencia fragmentada. Un cliente debidamente escrito DEBE enviar este encabezado. Consulte http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4 – Keith

+0

¿Por qué no utiliza el módulo SimpleHTTPServer? – Keith

Respuesta

9

comentario de Keith es correcta. Esto es lo que se ve como

 length = int(self.headers.getheader('content-length')) 
    data = self.rfile.read(length) 
+0

Como dice en la pregunta "En otras palabras, no tengo un encabezado Content-Size". – Joakim