Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simple Python 3 HTTP server for logging all GET and POST requests
#!/usr/bin/env python3
"""
Very simple HTTP server in python for logging requests
Usage::
./server.py [<port>]
"""
from http.server import BaseHTTPRequestHandler, HTTPServer
import logging
class S(BaseHTTPRequestHandler):
def _set_response(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
self._set_response()
self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
def do_POST(self):
content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
post_data = self.rfile.read(content_length) # <--- Gets the data itself
logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
str(self.path), str(self.headers), post_data.decode('utf-8'))
self._set_response()
self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
def run(server_class=HTTPServer, handler_class=S, port=8080):
logging.basicConfig(level=logging.INFO)
server_address = ('', port)
httpd = server_class(server_address, handler_class)
logging.info('Starting httpd...\n')
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
logging.info('Stopping httpd...\n')
if __name__ == '__main__':
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
@hihei

This comment has been minimized.

Copy link

hihei commented May 2, 2018

hey . can you tell me how it works ? i am not sure how much pressure it can be push. Thanks

@jmarshall9120

This comment has been minimized.

Copy link

jmarshall9120 commented Sep 18, 2018

What do you do when content-length is wrong or missing?

@aapjeisbaas

This comment has been minimized.

Copy link

aapjeisbaas commented Mar 20, 2019

love it!
thanks Soooo much ;-D

@drjoms

This comment has been minimized.

Copy link

drjoms commented May 16, 2019

arm... i amkinda new to python.
saved file throws this:

File "sample_post_server.py", line 48
run()
^
IndentationError: expected an indented block

i added a few new line characters for good measure. Still same error

@grumo35

This comment has been minimized.

Copy link

grumo35 commented Jun 4, 2019

arm... i amkinda new to python.
saved file throws this:

File "sample_post_server.py", line 48
run()
^
IndentationError: expected an indented block

i added a few new line characters for good measure. Still same error

You probably failed to create the exact same copy of the file, you have to take care of the indentation.
make sure everything is indented as intended.

@menkrep1337

This comment has been minimized.

Copy link

menkrep1337 commented Jun 10, 2019

THX

@aaninu

This comment has been minimized.

Copy link

aaninu commented Jun 23, 2019

Thanks

@unaimillan

This comment has been minimized.

Copy link

unaimillan commented Jul 2, 2019

❤️ Thanks ❤️

@David3310273

This comment has been minimized.

Copy link

David3310273 commented Oct 26, 2019

How do you get the params of the POST request?

@mdonkers

This comment has been minimized.

Copy link
Owner Author

mdonkers commented Oct 28, 2019

Which parameters do you mean @David3310273? It logs the full path (I believe), the headers and the body. Otherwise feel free to look into Python methods on how to extract the parameters from a POST request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.