2012-09-27 15 views
5

मैं एक साधारण SocketServer.TCPServer अनुरोध हैंडलर (StreamRequestHandler) लिख रहा हूं जो हेडर और संदेश निकाय के साथ अनुरोध को कैप्चर करेगा। यह एक HTTP सर्वर को बाहर निकालने के लिए है जिसे हम परीक्षण के लिए उपयोग कर सकते हैं।पायथन टीपीसीएसवरवर rfile.read ब्लॉक

मुझे अनुरोध लाइन या हेडर को पकड़ने में कोई परेशानी नहीं है।

यदि मैं 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

WITH HTTP विकल्प या तो सामग्री-लंबाई शीर्षलेख (यदि कोई शरीर है) का उपयोग करते हैं, या खंडित स्थानांतरण एन्कोडिंग का उपयोग करते हैं। एक उचित लिखित ग्राहक को यह हेडर भेजना होगा। देखें http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4 – Keith

+0

आप SimpleHTTPServer मॉड्यूल का उपयोग क्यों नहीं करते? – Keith

उत्तर

9

कीथ की टिप्पणी सही है। यहाँ यह क्या लग रहा है

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

जैसा कि वह सवाल में कहते हैं "दूसरे शब्दों में, मेरे पास सामग्री-आकार शीर्षलेख नहीं है।" – Joakim

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^