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
Consulte la sección sobre [sockets no bloqueantes] (http://docs.python.org/howto/sockets.html#non-blocking-sockets). –
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
¿Por qué no utiliza el módulo SimpleHTTPServer? – Keith