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
Zobacz sekcję o [non-blocking gniazda] (http://docs.python.org/howto/sockets.html#non-blocking-sockets). –
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
Dlaczego nie używasz modułu SimpleHTTPServer? – Keith