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__ |
---|