Skip to content

Instantly share code, notes, and snippets.

@jrasanen
Created April 24, 2019 14:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jrasanen/8e29024ec787d145368430bdc181c6d9 to your computer and use it in GitHub Desktop.
Save jrasanen/8e29024ec787d145368430bdc181c6d9 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
Usage:
python3 http-debug-server.py -a <bind-address> -p <bind-port>
'''
import json
import string
from pprint import pprint
from http.server import HTTPServer, BaseHTTPRequestHandler
class DummyHTTPHandler(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server, read_from):
if read_from != None:
self.response = open(read_from).read()
else:
self.response = ''
super().__init__(request, client_address, server)
def log_message(self, format, *args):
pass
def _print(self, method, headers):
addr = ''.join([str(i) for i in self.client_address])
msg = '{} - {} - {}'.format(addr, self.request_version, self.path)
print('# {} {}'.format(method, msg))
print('\n'.join('{}: {}'.format(k, v) for k, v in headers.items()))
def _end(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', 'Content-Type, Access-Control-Allow-Headers')
self.end_headers()
self.wfile.write(self.response.encode('utf-8'))
def do_GET(self):
self._print('GET', self.headers)
self._end()
def do_POST(self):
# Note, this dies if any odd characters are sent before content length
msg_length = int(self.headers.get('Content-Length', 0))
self._print('POST', self.headers)
print('\n# POST content\n')
data = self.rfile.read(msg_length)
# Try to pretty print json, if it wasn't json then just dump it
try:
print(json.dumps(json.loads(data), indent=2, sort_keys=True))
except Exception:
pprint(data)
self._end()
def do_OPTIONS(self):
self._print('OPTIONS', self.headers)
self._end()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Prints everything to stdout')
parser.add_argument('-a', '--address', help='default: 127.0.0.1')
parser.add_argument('-p', '--port', help='default: 8080', type=int)
parser.add_argument('-r', '--read_from', help='path to file to read and send as response', default=None, type=str)
args = parser.parse_args()
server = HTTPServer(
(args.address or '127.0.0.1', args.port or 8080),
lambda request, client_address, server: DummyHTTPHandler(request, client_address, server, args.read_from),
)
server.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment