2012-04-04 9 views
1
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def do_POST(self): 
     ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
     postvars = {} 
     try: 
      if ctype == 'application/x-www-form-urlencoded': 
       length = int(self.headers.getheader('content-length')) 
       postvars = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1) 

      self.send_response(200) 
      self.send_header("Content-type", "text") 
      self.send_header("Content-length", str(len(body))) 
      self.end_headers() 
      self.wfile.write(body) 
     except: 
      print "Error" 


def httpd(handler_class=MyHandler, server_address = ('2.3.4.5', 80)): 
    try: 
     print "Server started" 
     srvr = BaseHTTPServer.HTTPServer(server_address, handler_class) 
     srvr.serve_forever() # serve_forever 
    except KeyboardInterrupt: 
     server.socket.close() 


if __name__ == "__main__": 
    httpd() 

Ich habe den Großteil des Codes bereit. Ich muss Code zum Schließen der Verbindung hinzufügen, wenn der Client inaktiv ist oder nicht etwa 10 Sekunden lang antwortet (so etwas wie https://stackoverflow.com/a/265741/204623). Grundsätzlich möchte ich nicht, dass der Server den Aufruf von send_response(), wfile.write() usw. nicht blockiert. Wie kann ich das tun?Wie erstellt man einen einfachen HTTP POST Server?

+1

Ich bin mir nicht sicher, warum Sie dies erstellen wollen, aber wenn es nicht viele Treffer erhalten wird, muss nichts anderes tun, als POST und/oder GET, und es macht Ihnen nichts aus, öffentlich zu sein, können Sie Google verwenden App Engine, die einfach einzurichten ist. – apple16

Antwort

3

Try this:

import BaseHTTPServer 

class TimeoutServer(BaseHTTPServer.HTTPServer): 
    def get_request(self): 
     result = self.socket.accept() 
     result[0].settimeout(10) 
     return result 

dann die TimeoutServer Klasse anstelle von HTTPServer verwenden Timeout Unterstützung zu erhalten.

Verwandte Themen