| 1 | # (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org) |
|---|
| 2 | # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php |
|---|
| 3 | # (c) 2005 Clark C. Evans |
|---|
| 4 | # This module is part of the Python Paste Project and is released under |
|---|
| 5 | # the MIT License: http://www.opensource.org/licenses/mit-license.php |
|---|
| 6 | # This code was written with funding by http://prometheusresearch.com |
|---|
| 7 | """ |
|---|
| 8 | Various Applications for Debugging/Testing Purposes |
|---|
| 9 | """ |
|---|
| 10 | |
|---|
| 11 | import time |
|---|
| 12 | __all__ = ['SimpleApplication', 'SlowConsumer'] |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | class SimpleApplication(object): |
|---|
| 16 | """ |
|---|
| 17 | Produces a simple web page |
|---|
| 18 | """ |
|---|
| 19 | def __call__(self, environ, start_response): |
|---|
| 20 | body = "<html><body>simple</body></html>" |
|---|
| 21 | start_response("200 OK", [('Content-Type', 'text/html'), |
|---|
| 22 | ('Content-Length', str(len(body)))]) |
|---|
| 23 | return [body] |
|---|
| 24 | |
|---|
| 25 | class SlowConsumer(object): |
|---|
| 26 | """ |
|---|
| 27 | Consumes an upload slowly... |
|---|
| 28 | |
|---|
| 29 | NOTE: This should use the iterator form of ``wsgi.input``, |
|---|
| 30 | but it isn't implemented in paste.httpserver. |
|---|
| 31 | """ |
|---|
| 32 | def __init__(self, chunk_size = 4096, delay = 1, progress = True): |
|---|
| 33 | self.chunk_size = chunk_size |
|---|
| 34 | self.delay = delay |
|---|
| 35 | self.progress = True |
|---|
| 36 | |
|---|
| 37 | def __call__(self, environ, start_response): |
|---|
| 38 | size = 0 |
|---|
| 39 | total = environ.get('CONTENT_LENGTH') |
|---|
| 40 | if total: |
|---|
| 41 | remaining = int(total) |
|---|
| 42 | while remaining > 0: |
|---|
| 43 | if self.progress: |
|---|
| 44 | print "%s of %s remaining" % (remaining, total) |
|---|
| 45 | if remaining > 4096: |
|---|
| 46 | chunk = environ['wsgi.input'].read(4096) |
|---|
| 47 | else: |
|---|
| 48 | chunk = environ['wsgi.input'].read(remaining) |
|---|
| 49 | if not chunk: |
|---|
| 50 | break |
|---|
| 51 | size += len(chunk) |
|---|
| 52 | remaining -= len(chunk) |
|---|
| 53 | if self.delay: |
|---|
| 54 | time.sleep(self.delay) |
|---|
| 55 | body = "<html><body>%d bytes</body></html>" % size |
|---|
| 56 | else: |
|---|
| 57 | body = ('<html><body>\n' |
|---|
| 58 | '<form method="post" enctype="multipart/form-data">\n' |
|---|
| 59 | '<input type="file" name="file">\n' |
|---|
| 60 | '<input type="submit" >\n' |
|---|
| 61 | '</form></body></html>\n') |
|---|
| 62 | print "bingles" |
|---|
| 63 | start_response("200 OK", [('Content-Type', 'text/html'), |
|---|
| 64 | ('Content-Length', len(body))]) |
|---|
| 65 | return [body] |
|---|
| 66 | |
|---|
| 67 | def make_test_app(global_conf): |
|---|
| 68 | return SimpleApplication() |
|---|
| 69 | |
|---|
| 70 | make_test_app.__doc__ = SimpleApplication.__doc__ |
|---|
| 71 | |
|---|
| 72 | def make_slow_app(global_conf, chunk_size=4096, delay=1, progress=True): |
|---|
| 73 | from paste.deploy.converters import asbool |
|---|
| 74 | return SlowConsumer( |
|---|
| 75 | chunk_size=int(chunk_size), |
|---|
| 76 | delay=int(delay), |
|---|
| 77 | progress=asbool(progress)) |
|---|
| 78 | |
|---|
| 79 | make_slow_app.__doc__ = SlowConsumer.__doc__ |
|---|