Skip to content

Instantly share code, notes, and snippets.

@gator-dev
Created January 26, 2021 15:13
Show Gist options
  • Select an option

  • Save gator-dev/3ff5ed8fc6bbf4df3497faa1a0a8bfe3 to your computer and use it in GitHub Desktop.

Select an option

Save gator-dev/3ff5ed8fc6bbf4df3497faa1a0a8bfe3 to your computer and use it in GitHub Desktop.
Simple Python 3 HTTPS server for logging all GET and POST requests
#!/usr/bin/env python3
"""
Very simple python3 HTTPS server for logging requests
Combination of these two snippets:
- https://gist.github.com/mdonkers/63e115cc0c79b4f6b8b3a6b797e485c7
- https://gist.github.com/dergachev/7028596
-- # taken from http://www.piware.de/2011/01/creating-an-https-server-in-python/
Usage::
./server.py [port >=1024]
sudo ./server.py [port <1024]
# generate server.pem with the following command:
# openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
"""
from http.server import BaseHTTPRequestHandler, HTTPServer
from ssl import wrap_socket
from base64 import b64encode
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()
# Sends a base64 encoded response to the POST request
response = b"Hello friend2!!"
b64response = b64encode(response)
print(f"response = {response}, in base64 = {b64response}")
self.wfile.write(b64response)
#self.wfile.write("POST complete")
def run(server_class=HTTPServer, handler_class=S, port=443):
logging.basicConfig(level=logging.INFO)
server_address = ('', port)
httpd = server_class(server_address, handler_class)
logging.info(f'Starting https on port {port}...\n')
try:
httpd.socket = wrap_socket(httpd.socket, certfile='./server.pem', server_side=True)
httpd.serve_forever()
except FileNotFoundError as err:
logging.error(f"Issue with .\\server.pem file. {err}")
logging.info(f" You can create the file by running: \n \
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes ")
except KeyboardInterrupt:
httpd.server_close()
logging.info('Stopping https...\n')
if __name__ == '__main__':
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment