do_POST not working on http.server with python

Rahul Raghunath rahulraghu94 at gmail.com
Thu Apr 28 04:36:01 EDT 2016


 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!



More information about the Python-list mailing list