do_POST not working on http.server with python

Pierre Quentel pierre.quentel at gmail.com
Sun May 1 15:16:18 EDT 2016


Le jeudi 28 avril 2016 10:36:27 UTC+2, Rahul Raghunath a écrit :
> 0
> down vote
> favorite
> 	
> 
> I'm trying to create a simple http server with basic GET and POST functionality. The program is supposed to GET requests by printing out a simple webpage that greets a user and askes how he would rather be greeted. When the user enters a greeting of his choice, the webpage should now greet him as he had chosen.
> 
> While GET seems to be working fine, POST is not. I tried debugging by printing at every code execution and it seems to be getting stuck here:
> 
> ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
> 
> I'll paste the code full code below, along with my terminal output.
> 
> Code:
> 
>     from http.server import BaseHTTPRequestHandler, HTTPServer
>     import cgi
> 
> 
>     class webServerHandler(BaseHTTPRequestHandler):
> 
>         def do_GET(self):
>             try:
>                 if self.path.endswith("/hello"):
>                     self.send_response(200)
>                     self.send_header('Content-type', 'text/html')
>                     self.end_headers()
>                     output = ""
>                     output += "<html><body>"
>                     output += "<h1>Hello!</h1>"
>                     output += '''<form method='POST' enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form>'''
>                     output += "</body></html>"
>                     self.wfile.write(output.encode(encoding = 'utf_8'))
>                     print (output)
>                     return
> 
>                 if self.path.endswith("/hola"):
>                     self.send_response(200)
>                     self.send_header('Content-type', 'text/html')
>                     self.end_headers()
>                     output = ""
>                     output += "<html><body>"
>                     output += "<h1>&#161 Hola !</h1>"
>                     output += '''<form method='POST' enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form>'''
>                     output += "</body></html>"
>                     self.wfile.write(output.encode(encoding = 'utf_8'))
>                     print (output)
>                     return
> 
>             except IOError:
>                 self.send_error(404, 'File Not Found: %s' % self.path)
> 
>         def do_POST(self):
>             try:
>                 self.send_response(201)
>                 print("Sent response")
>                 self.send_header('Content-type', 'text/html')
>                 print("Sent headers")
>                 self.end_headers()
>                 print("Ended header")
>                 ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
>                 print("Parsed headers")
>                 if ctype == 'multipart/form-data':
>                     fields = cgi.parse_multipart(self.rfile, pdict)
>                     messagecontent = fields.get('message')
>                 print("Receiver message content")
>                 output = ""
>                 output += "<html><body>"
>                 output += " <h2> Okay, how about this: </h2>"
>                 output += "<h1> %s </h1>" % messagecontent[0]
>                 output += '''<form method='POST' enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form>'''
>                 output += "</body></html>"
>                 print(output)
>                 self.wfile.write(output.encode(encoding = 'utf_8'))
>                 print ("Wrote through CGI")
>             except:
>                 pass
> 
> 
>     def main():
>         try:
>             port = 8080
>             server = HTTPServer(('', port), webServerHandler)
>             print ("Web Server running on port", port)
>             server.serve_forever()
>         except KeyboardInterrupt:
>             print (" ^C entered, stopping web server....")
>             server.socket.close()
> 
>     if __name__ == '__main__':
>         main()
> 
> Terminal Output:
> 
> Web Server running on port 8080
> 127.0.0.1 - - [28/Apr/2016 13:28:59] "GET /hello HTTP/1.1" 200 -
> <html><body><h1>Hello!</h1><form method='POST'      enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form></body></html>
> 127.0.0.1 - - [28/Apr/2016 13:29:09] "POST /hello HTTP/1.1" 201 -
> Sent response
> Sent headers
> Ended header
> 
> As you can see, the POST function does not seem to go beyong the parse_header command. I cannot figure this out, and any help would be usefu!

Hi,

It's generally not considered good practise to silently ignore exceptions in a try/except where the except clause is just :

except:
   pass

If you remove the try/except in do_POST you will see this interesting error message :

AttributeError: 'HTTPMessage' object has no attribute 'getheader'



More information about the Python-list mailing list