-
-
Save andreisavu/719843 to your computer and use it in GitHub Desktop.
| #!/usr/bin/env python | |
| """ Test HTTP Server | |
| This script starts a http server that will respond to HTTP requests | |
| with a predefined response. | |
| Usage: | |
| ./http_server.py --port=8080 --code=404 --content="Page not Found" | |
| ./http_server.py --port=8080 --code=500 --content="Internal Server Error" | |
| """ | |
| import sys, os | |
| from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler | |
| from optparse import OptionParser | |
| class APIHandler(BaseHTTPRequestHandler, object): | |
| def __init__(self, *args, **kwargs): | |
| super(APIHandler, self).__init__(*args, **kwargs) | |
| def do_request(self): | |
| global options | |
| self.send_response(int(options.code)) | |
| self.send_header('Content-type', options.type) | |
| self.end_headers() | |
| self.wfile.write(options.content) | |
| def do_GET(self): | |
| return self.do_request() | |
| def do_POST(self): | |
| return self.do_request() | |
| def main(): | |
| global options | |
| options, args = parse_cli() | |
| server_address = ('', int(options.port)) | |
| httpd = HTTPServer(server_address, APIHandler) | |
| try: | |
| httpd.serve_forever() | |
| except KeyboardInterrupt: | |
| httpd.socket.close() | |
| def parse_cli(): | |
| parser = OptionParser() | |
| parser.add_option('-p', '--port', default=8000) | |
| parser.add_option('', '--code', default=200, \ | |
| help="request return code") | |
| parser.add_option('', '--type', default='text/html', \ | |
| help="content type") | |
| parser.add_option('', '--content', default='') | |
| return parser.parse_args() | |
| if __name__ == '__main__': | |
| sys.exit(main()) |
I like it. Thanks for sharing. Could you tell more about the Marrow Open Source Projects?
Marrow is a "collective" (similar to the Zope collective, or repoze.* collective) name for a collection of projects designed to replace/supersede existing web development meta-component collections like Paste, WebOb, WebError, etc. The primary goal is to conform to the draft WSGI 2 spec (PEP 444) and bring Python 3 compatibility to the Python web world by brute forcing the chicken-and-egg problem. Packages should be extremely task-specific and have few external dependencies.
Thus Marrow includes command line script creation, configuration parsing, a highly performant HTTP/1.1 compliant server, various bits of middleware (and filters, a new concept in my modified PEP 444) and more. As a requirement for 1.0 release of each package, the package must have complete documentation, 100% unit test coverage, and must include examples of usage.
Packages currently released include: marrow.io, marrow.util, marrow.server, marrow.server.http, marrow.script, and marrow.blueprint is in heavy development. Not all of these are 1.0 yet.
Currently I'm going it alone, but the more interest I can generate the better!
Nice! I will take a closer look at the source code.
hm, seems like an old conversation, but maybe even more relevant now -- with the current "microservice" craze, I found myself writing silly little one-off servers a lot just to provide integration testing in dev environments. I finally got sick of it and made
https://github.com/jar-o/dumdum
which allows you to mock out servers quickly without having to write actual code.
https://gist.github.com/719889 is an example of a similar mock HTTP server written using marrow.server (for connection handling) and marrow.script (for command line processing). The main difference is that the marrow-based mock server requires a complete status code (not just integer) as the status and should be Python 3.1+ compatible, though this has not been tested.