Mercurial > hg > RequestDumpster
annotate requestdumpster/dumpster.py @ 16:9ef205ebb047 default tip
CORS
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Mon, 12 Dec 2016 15:26:40 -0800 |
parents | d2585c78e70f |
children |
rev | line source |
---|---|
1 | 1 #!/usr/bin/env python |
2 | |
3 """ | |
4 dump HTTP requests | |
5 """ | |
6 | |
2 | 7 # imports |
7
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
8 import argparse |
3 | 9 import os |
2 | 10 import sys |
3 | 11 import time |
8
eb260393caef
this is about as far as I want to get without webob
Jeff Hammel <k0scist@gmail.com>
parents:
7
diff
changeset
|
12 from wsgiref import simple_server |
10 | 13 from webob import Request, Response |
1 | 14 |
5 | 15 # module globals |
16 __all__ = ['RequestDumpster'] | |
17 | |
1 | 18 class RequestDumpster(object): |
5 | 19 """WSGI interface to dump HTTP requests""" |
1 | 20 |
3 | 21 def __init__(self, directory=None): |
22 if directory is not None and not os.path.isdir(directory): | |
23 raise Exception("Not a directory") | |
24 self.directory = directory | |
25 | |
1 | 26 def __call__(self, environ, start_response): |
27 """WSGI""" | |
28 | |
10 | 29 request = Request(environ) |
30 lines = ["{REQUEST_METHOD} {PATH_INFO} {SERVER_PROTOCOL}".format(PATH_INFO=request.path_qs, | |
31 REQUEST_METHOD=request.method, | |
32 SERVER_PROTOCOL=request.environ['SERVER_PROTOCOL'])] | |
33 lines.extend(['{0}: {1}'.format(*header) | |
34 for header in request.headers.items()]) | |
35 lines.append('') | |
36 lines.append(request.body) | |
12 | 37 body = '\r\n'.join(lines) |
8
eb260393caef
this is about as far as I want to get without webob
Jeff Hammel <k0scist@gmail.com>
parents:
7
diff
changeset
|
38 |
15 | 39 if self.directory: |
40 filename = '{0}'.format(time.time()) | |
41 with open(os.path.join(self.directory, filename), 'w') as f: | |
42 f.write(body) | |
43 | |
16 | 44 # CORS |
45 headers = [('Access-Control-Allow-Origin', '*')] | |
46 headers.append(('Access-Control-Allow-Headers', | |
47 ', '.join(request.headers.keys()))) | |
48 headers.append(('Access-Control-Allow-Methods', | |
49 'GET, POST, DELETE, PUT, PATCH, OPTIONS')) | |
50 | |
10 | 51 response = Response(content_type='text/plain', |
52 body=body) | |
16 | 53 for key, value in headers: |
54 response.headers.add(key, value) | |
10 | 55 return response(environ, start_response) |
5 | 56 |
1 | 57 def main(args=sys.argv[1:]): |
58 """CLI""" | |
59 | |
60 # parse command line arguments | |
7
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
61 parser = argparse.ArgumentParser(description=__doc__) |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
62 parser.add_argument('-p', '--port', dest='port', |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
63 type=int, default=9555, |
14 | 64 help="port to serve on [DEFAULT: %(default)s]") |
7
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
65 parser.add_argument('-d', '--directory', dest='directory', |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
66 help="directory to output requests to") |
1 | 67 options = parser.parse_args() |
68 | |
5 | 69 # instantiate WSGI app |
6 | 70 app = RequestDumpster(directory=options.directory) |
71 | |
1 | 72 # construct url |
73 url = 'http://localhost:{port}/'.format(port=options.port) | |
74 | |
6 | 75 # serve some web |
8
eb260393caef
this is about as far as I want to get without webob
Jeff Hammel <k0scist@gmail.com>
parents:
7
diff
changeset
|
76 host = '127.0.0.1' |
eb260393caef
this is about as far as I want to get without webob
Jeff Hammel <k0scist@gmail.com>
parents:
7
diff
changeset
|
77 server = simple_server.make_server(host=host, |
eb260393caef
this is about as far as I want to get without webob
Jeff Hammel <k0scist@gmail.com>
parents:
7
diff
changeset
|
78 port=options.port, |
eb260393caef
this is about as far as I want to get without webob
Jeff Hammel <k0scist@gmail.com>
parents:
7
diff
changeset
|
79 app=app) |
7
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
80 print url |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
81 try: |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
82 server.serve_forever() |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
83 except KeyboardInterrupt: |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
84 pass |
83c51f45b82d
optparse -> argparse and the like
Jeff Hammel <k0scist@gmail.com>
parents:
6
diff
changeset
|
85 |
6 | 86 |
1 | 87 if __name__ == '__main__': |
88 main() |