Search code examples
phppython-3.xhttpwebserver

http.server - Unsupported method ('POST')


So I have created a website, when the user tries to fill out the login form (username and password), the following error message is displayed:

Error response
Error code: 501

Message: Unsupported method ('POST').

Error code explanation: HTTPStatus.NOT_IMPLEMENTED - Server does not support this operation.

For the server im using Python 3 http.server. To start the server i have a batch file containing the following code:

python -m http.server 80

I'm looking for a way to receive the login credentials the user submitted, and store them in a text file (.txt).

After doing some research I got the impression I need to create a PHP script, i have no idea how to do this. here is my attempt at it:

<?php
$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

echo $username, ' ', $password;
?>

Solution

  • Thank you @MonkeyZeus, I managed to solve the problem by making a few changes to your code.

    import socketserver
    import http.server
    import logging
    import cgi
    
    PORT = 80
    
    class ServerHandler(http.server.SimpleHTTPRequestHandler):
    
        def do_GET(self):
            logging.error(self.headers)
            http.server.SimpleHTTPRequestHandler.do_GET(self)
    
        def do_POST(self):
            logging.error(self.headers)
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
            for item in form.list:
                logging.error(item)
            http.server.SimpleHTTPRequestHandler.do_GET(self)
    
            with open("data.txt", "w") as file:
                for key in form.keys(): 
                    file.write(str(form.getvalue(str(key))) + ",")
    
    Handler = ServerHandler
    
    httpd = socketserver.TCPServer(("", PORT), Handler)
    
    print("serving at port", PORT)
    httpd.serve_forever()
    

    When the post request is received, a text file called "data" is created. A for loop is then used to iterate through the keys (source) and write there values to the file.