2012-09-27 25 views
5

我正在寫一個簡單的SocketServer.TCPServer請求處理程序(StreamRequestHandler),它將捕獲請求以及標頭和消息主體。這是爲了僞造一個我們可以用來測試的HTTP服務器。Python TPCServer rfile.read blocks

我沒有麻煩抓住請求行或標題。

如果我試圖從rfile中獲取比存在更多的代碼塊。如何在不知道尺寸的情況下抓取所有請求主體?換句話說,我沒有Content-Size標題。

這裏是什麼,我現在有一個片段:

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

請參閱關於[非阻塞套接字](http://docs.python.org/howto/sockets.html#non-blocking-sockets)一節。 –

+2

通過使用HTTP,可以使用Content-Length頭部(如果存在主體)或使用分塊傳輸編碼。一個寫得很好的客戶端必須發送這個頭文件。請參閱http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4 – Keith

+0

爲什麼不使用SimpleHTTPServer模塊? – Keith

回答

9

Keith的評論是正確的。這是它看起來像

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

正如他在問題中所說:「換句話說,我沒有Content-Size標題。」 – Joakim