-
-
Save 1kastner/e083f9e813c0464e6a2ec8910553e632 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
# Reflects the requests from HTTP methods GET, POST, PUT, and DELETE | |
# Written by Nathan Hamiel (2010) | |
from http.server import HTTPServer, BaseHTTPRequestHandler | |
from optparse import OptionParser | |
class RequestHandler(BaseHTTPRequestHandler): | |
def do_GET(self): | |
request_path = self.path | |
print("\n----- Request Start ----->\n") | |
print("Request path:", request_path) | |
print("Request headers:", self.headers) | |
print("<----- Request End -----\n") | |
self.send_response(200) | |
self.send_header("Set-Cookie", "foo=bar") | |
self.end_headers() | |
def do_POST(self): | |
request_path = self.path | |
print("\n----- Request Start ----->\n") | |
print("Request path:", request_path) | |
request_headers = self.headers | |
content_length = request_headers.get('Content-Length') | |
length = int(content_length) if content_length else 0 | |
print("Content Length:", length) | |
print("Request headers:", request_headers) | |
print("Request payload:", self.rfile.read(length)) | |
print("<----- Request End -----\n") | |
self.send_response(200) | |
self.end_headers() | |
do_PUT = do_POST | |
do_DELETE = do_GET | |
def main(): | |
port = 8080 | |
print('Listening on 0.0.0.0:%s' % port) | |
server = HTTPServer(('', port), RequestHandler) | |
server.serve_forever() | |
if __name__ == "__main__": | |
parser = OptionParser() | |
parser.usage = ("Creates an http-server that will echo out any GET or POST parameters\n" | |
"Run:\n\n" | |
" reflect") | |
(options, args) = parser.parse_args() | |
main() |
Please change
Listening on localhost
toListening on all interfaces
or maybeListening on 0.0.0.0
, because using an empty host onHTTPServer
means all interfaces, not just localhost. This has serious security implications. I know this is just a test echo server, but it would be great not to mislead users.
Good suggestions, I modified it accordingly.
I noticed this fails when being accessed from fetch due to CORS errors and lacking OPTIONS. I wonder if that is an easy fix?
I have not used this script for a long time, it is rather a template which can be adjusted as needed. If you have a solution, it could be great if you share that gist as well!
Thanks for this! Came in clutch testing an API wrapper!
Thanks for this!!!!
My version with some colorized output: https://gist.github.com/ricleal/72efc72d7de5e23ce98b9afb2973232a
Nice, thank you @ricleal!
Thanks, this worked first try and helped a lot. 👍