2012-09-27 9 views
5

Piszę prostą obsługę żądań SocketServer.TCPServer (StreamRequestHandler), która przechwyci żądanie, wraz z nagłówkami i treścią wiadomości. To służy do fałszowania serwera HTTP, który możemy wykorzystać do testowania.Python TPCServer rfile.read bloki

Nie mam problemu z przechwytywaniem linii lub nagłówków.

Jeśli spróbuję pobrać więcej z rfile niż istnieje, kod blokuje się. Jak mogę pobrać całą treść żądania, nie znając jej rozmiaru? Innymi słowy, nie mam nagłówka Content-Size.

Oto fragment tego, co mam teraz:

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

Zobacz sekcję o [non-blocking gniazda] (http://docs.python.org/howto/sockets.html#non-blocking-sockets). –

+2

Z HTTP można wybrać nagłówek Content-Length (jeśli istnieje ciało) lub użyć kodowania transferu typu chunked. Poprawnie napisany klient MUSI wysłać ten nagłówek. Zobacz http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4 – Keith

+0

Dlaczego nie używasz modułu SimpleHTTPServer? – Keith

Odpowiedz

9

komentarz Keitha jest poprawna. Oto jak to wygląda

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

Jak mówi w pytaniu "Innymi słowy, nie mam nagłówka Content-Size". – Joakim