Mercurial > cpython-lru_cache-weakref
annotate Lib/cgi.py @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 7b1f8ede9b53 |
| children | 74bfeb364a23 |
| rev | line source |
|---|---|
| 14989 | 1 #! /usr/local/bin/python |
|
3106
c41a8e501973
handle missing QUERY_STRING
Guido van Rossum <guido@python.org>
parents:
2918
diff
changeset
|
2 |
|
16583
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
3 # NOTE: the above "/usr/local/bin/python" is NOT a mistake. It is |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
4 # intentionally NOT "/usr/bin/env python". On many systems |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
5 # (e.g. Solaris), /usr/local/bin is not in $PATH as passed to CGI |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
6 # scripts, and /usr/local/bin is the default directory where Python is |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
7 # installed, so /usr/bin/env would be unable to find python. Granted, |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
8 # binary installations by Linux vendors often install Python in |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
9 # /usr/bin. So let those vendors patch cgi.py to match their choice |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
10 # of installation. |
|
817df9efacba
Added a comment explaining why this file must really have #!
Guido van Rossum <guido@python.org>
parents:
16503
diff
changeset
|
11 |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
12 """Support module for CGI (Common Gateway Interface) scripts. |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
13 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
14 This module defines a number of utilities for use by CGI scripts |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
15 written in Python. |
|
11870
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
16 """ |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
17 |
|
13840
465144abf02a
Remove very long doc string (it's all in the docs)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
13620
diff
changeset
|
18 # XXX Perhaps there should be a slimmed version that doesn't contain |
|
465144abf02a
Remove very long doc string (it's all in the docs)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
13620
diff
changeset
|
19 # all those backwards compatible and debugging classes and functions? |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
20 |
|
11870
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
21 # History |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
22 # ------- |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
23 # |
|
11870
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
24 # Michael McLay started this module. Steve Majewski changed the |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
25 # interface to SvFormContentDict and FormContentDict. The multipart |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
26 # parsing was inspired by code submitted by Andreas Paepcke. Guido van |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
27 # Rossum rewrote, reformatted and documented the module and is currently |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11849
diff
changeset
|
28 # responsible for its maintenance. |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
29 # |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
30 |
|
18337
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
31 __version__ = "2.6" |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
32 |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
33 |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
34 # Imports |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
35 # ======= |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
36 |
| 34294 | 37 from operator import attrgetter |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
38 import sys |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
39 import os |
|
5988
5993a099d9b0
Changes suggested by Jim fulton:
Guido van Rossum <guido@python.org>
parents:
5870
diff
changeset
|
40 import urllib |
|
14196
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
41 import UserDict |
|
48995
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
42 import urlparse |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
43 |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
44 from warnings import filterwarnings, catch_warnings, warn |
|
48948
d563621d76db
Move test.test_support.catch_warning() to the warnings module, rename it
Brett Cannon <bcannon@gmail.com>
parents:
48250
diff
changeset
|
45 with catch_warnings(): |
|
d563621d76db
Move test.test_support.catch_warning() to the warnings module, rename it
Brett Cannon <bcannon@gmail.com>
parents:
48250
diff
changeset
|
46 if sys.py3kwarning: |
|
d563621d76db
Move test.test_support.catch_warning() to the warnings module, rename it
Brett Cannon <bcannon@gmail.com>
parents:
48250
diff
changeset
|
47 filterwarnings("ignore", ".*mimetools has been removed", |
|
d563621d76db
Move test.test_support.catch_warning() to the warnings module, rename it
Brett Cannon <bcannon@gmail.com>
parents:
48250
diff
changeset
|
48 DeprecationWarning) |
|
48250
ca4c51358629
Silence DeprecationWarning raised by mimetools and rfc822 in cgi.
Brett Cannon <bcannon@gmail.com>
parents:
47798
diff
changeset
|
49 import mimetools |
|
48948
d563621d76db
Move test.test_support.catch_warning() to the warnings module, rename it
Brett Cannon <bcannon@gmail.com>
parents:
48250
diff
changeset
|
50 if sys.py3kwarning: |
|
d563621d76db
Move test.test_support.catch_warning() to the warnings module, rename it
Brett Cannon <bcannon@gmail.com>
parents:
48250
diff
changeset
|
51 filterwarnings("ignore", ".*rfc822 has been removed", DeprecationWarning) |
|
48250
ca4c51358629
Silence DeprecationWarning raised by mimetools and rfc822 in cgi.
Brett Cannon <bcannon@gmail.com>
parents:
47798
diff
changeset
|
52 import rfc822 |
|
ca4c51358629
Silence DeprecationWarning raised by mimetools and rfc822 in cgi.
Brett Cannon <bcannon@gmail.com>
parents:
47798
diff
changeset
|
53 |
|
34293
cd517701fd93
Use cStringIO where available.
Raymond Hettinger <python@rcn.com>
parents:
33131
diff
changeset
|
54 try: |
|
cd517701fd93
Use cStringIO where available.
Raymond Hettinger <python@rcn.com>
parents:
33131
diff
changeset
|
55 from cStringIO import StringIO |
|
cd517701fd93
Use cStringIO where available.
Raymond Hettinger <python@rcn.com>
parents:
33131
diff
changeset
|
56 except ImportError: |
|
cd517701fd93
Use cStringIO where available.
Raymond Hettinger <python@rcn.com>
parents:
33131
diff
changeset
|
57 from StringIO import StringIO |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
58 |
|
17074
8323b098c6ce
Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents:
16821
diff
changeset
|
59 __all__ = ["MiniFieldStorage", "FieldStorage", "FormContentDict", |
|
8323b098c6ce
Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents:
16821
diff
changeset
|
60 "SvFormContentDict", "InterpFormContentDict", "FormContent", |
|
8323b098c6ce
Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents:
16821
diff
changeset
|
61 "parse", "parse_qs", "parse_qsl", "parse_multipart", |
|
8323b098c6ce
Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents:
16821
diff
changeset
|
62 "parse_header", "print_exception", "print_environ", |
|
8323b098c6ce
Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents:
16821
diff
changeset
|
63 "print_form", "print_directory", "print_arguments", |
|
8323b098c6ce
Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents:
16821
diff
changeset
|
64 "print_environ_usage", "escape"] |
|
4214
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
65 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
66 # Logging support |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
67 # =============== |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
68 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
69 logfile = "" # Filename to log to, if not empty |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
70 logfp = None # File object to log to, if not None |
|
4214
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
71 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
72 def initlog(*allargs): |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
73 """Write a log message, if there is a log file. |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
74 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
75 Even though this function is called initlog(), you should always |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
76 use log(); log is a variable that is set either to initlog |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
77 (initially), to dolog (once the log file has been opened), or to |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
78 nolog (when logging is disabled). |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
79 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
80 The first argument is a format string; the remaining arguments (if |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
81 any) are arguments to the % operator, so e.g. |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
82 log("%s: %s", "a", "b") |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
83 will write "a: b" to the log file, followed by a newline. |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
84 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
85 If the global logfp is not None, it should be a file object to |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
86 which log data is written. |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
87 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
88 If the global logfp is None, the global logfile may be a string |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
89 giving a filename to open, in append mode. This file should be |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
90 world writable!!! If the file can't be opened, logging is |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
91 silently disabled (since there is no safe place where we could |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
92 send an error message). |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
93 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
94 """ |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
95 global logfp, log |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
96 if logfile and not logfp: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
97 try: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
98 logfp = open(logfile, "a") |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
99 except IOError: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
100 pass |
|
4214
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
101 if not logfp: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
102 log = nolog |
|
4214
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
103 else: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
104 log = dolog |
|
28089
14f65d661084
Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents:
25214
diff
changeset
|
105 log(*allargs) |
|
4214
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
106 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
107 def dolog(fmt, *args): |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
108 """Write a log message to the log file. See initlog() for docs.""" |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
109 logfp.write(fmt%args + "\n") |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
110 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
111 def nolog(*allargs): |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
112 """Dummy function, assigned to log when logging is disabled.""" |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
113 pass |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
114 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
115 log = initlog # The current logging function |
|
4214
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
116 |
|
688d566cb15b
Added logging support.
Guido van Rossum <guido@python.org>
parents:
4213
diff
changeset
|
117 |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
118 # Parsing functions |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
119 # ================= |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
120 |
|
5499
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
121 # Maximum input we will accept when REQUEST_METHOD is POST |
|
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
122 # 0 ==> unlimited input |
|
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
123 maxlen = 0 |
|
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
124 |
|
4534
d90d7b541ada
Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents:
4486
diff
changeset
|
125 def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
126 """Parse a query in the environment or from a file (default stdin) |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
127 |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
128 Arguments, all optional: |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
129 |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
130 fp : file pointer; default: sys.stdin |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
131 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
132 environ : environment dictionary; default: os.environ |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
133 |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
134 keep_blank_values: flag indicating whether blank values in |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
135 URL encoded forms should be treated as blank strings. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
136 A true value indicates that blanks should be retained as |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
137 blank strings. The default false value indicates that |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
138 blank values are to be ignored and treated as if they were |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
139 not included. |
|
4534
d90d7b541ada
Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents:
4486
diff
changeset
|
140 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
141 strict_parsing: flag indicating what to do with parsing errors. |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
142 If false (the default), errors are silently ignored. |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
143 If true, errors raise a ValueError exception. |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
144 """ |
|
23609
456d58451fee
Use is None rather than general boolean
Raymond Hettinger <python@rcn.com>
parents:
22830
diff
changeset
|
145 if fp is None: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
146 fp = sys.stdin |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
147 if not 'REQUEST_METHOD' in environ: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
148 environ['REQUEST_METHOD'] = 'GET' # For testing stand-alone |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
149 if environ['REQUEST_METHOD'] == 'POST': |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
150 ctype, pdict = parse_header(environ['CONTENT_TYPE']) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
151 if ctype == 'multipart/form-data': |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
152 return parse_multipart(fp, pdict) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
153 elif ctype == 'application/x-www-form-urlencoded': |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
154 clength = int(environ['CONTENT_LENGTH']) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
155 if maxlen and clength > maxlen: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
156 raise ValueError, 'Maximum content length exceeded' |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
157 qs = fp.read(clength) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
158 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
159 qs = '' # Unknown content-type |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
160 if 'QUERY_STRING' in environ: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
161 if qs: qs = qs + '&' |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
162 qs = qs + environ['QUERY_STRING'] |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
163 elif sys.argv[1:]: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
164 if qs: qs = qs + '&' |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
165 qs = qs + sys.argv[1] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
166 environ['QUERY_STRING'] = qs # XXX Shouldn't, really |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
167 elif 'QUERY_STRING' in environ: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
168 qs = environ['QUERY_STRING'] |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
169 else: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
170 if sys.argv[1:]: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
171 qs = sys.argv[1] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
172 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
173 qs = "" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
174 environ['QUERY_STRING'] = qs # XXX Shouldn't, really |
|
4534
d90d7b541ada
Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents:
4486
diff
changeset
|
175 return parse_qs(qs, keep_blank_values, strict_parsing) |
|
2918
cfa9b3a84872
added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents:
2538
diff
changeset
|
176 |
|
cfa9b3a84872
added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents:
2538
diff
changeset
|
177 |
|
48995
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
178 # parse query string function called from urlparse, |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
179 # this is done in order to maintain backward compatiblity. |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
180 |
|
48995
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
181 def parse_qs(qs, keep_blank_values=0, strict_parsing=0): |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
182 """Parse a query given as a string argument.""" |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
183 warn("cgi.parse_qs is deprecated, use urlparse.parse_qs \ |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
184 instead",PendingDeprecationWarning) |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
185 return urlparse.parse_qs(qs, keep_blank_values, strict_parsing) |
|
4534
d90d7b541ada
Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents:
4486
diff
changeset
|
186 |
|
10920
3faa63430924
Patch by Jim Fulton: new function parse_qsl(), which is like
Guido van Rossum <guido@python.org>
parents:
10914
diff
changeset
|
187 |
|
3faa63430924
Patch by Jim Fulton: new function parse_qsl(), which is like
Guido van Rossum <guido@python.org>
parents:
10914
diff
changeset
|
188 def parse_qsl(qs, keep_blank_values=0, strict_parsing=0): |
|
48995
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
189 """Parse a query given as a string argument.""" |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
190 warn("cgi.parse_qsl is deprecated, use urlparse.parse_qsl instead", |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
191 PendingDeprecationWarning) |
|
49080
7b1f8ede9b53
Issue 3801. Fixing a dumb error in the deprecated parse_qsl()
Facundo Batista <facundobatista@gmail.com>
parents:
48995
diff
changeset
|
192 return urlparse.parse_qsl(qs, keep_blank_values, strict_parsing) |
| 2135 | 193 |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
194 def parse_multipart(fp, pdict): |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
195 """Parse multipart input. |
| 2135 | 196 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
197 Arguments: |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
198 fp : input file |
|
34367
5cd4fffaf910
Patch #1079734: remove dependencies on (deprecated) rfc822 and mimetools
Johannes Gijsbers <jlg@dds.nl>
parents:
34294
diff
changeset
|
199 pdict: dictionary containing other parameters of content-type header |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
200 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
201 Returns a dictionary just like parse_qs(): keys are the field names, each |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
202 value is a list of values for that field. This is easy to use but not |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
203 much good if you are expecting megabytes to be uploaded -- in that case, |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
204 use the FieldStorage class instead which is much more flexible. Note |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
205 that content-type is the raw, unparsed contents of the content-type |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
206 header. |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
207 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
208 XXX This does not parse nested multipart parts -- use FieldStorage for |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
209 that. |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
210 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
211 XXX This should really be subsumed by FieldStorage altogether -- no |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
212 point in having two implementations of the same parsing algorithm. |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
213 Also, FieldStorage protects itself better against certain DoS attacks |
|
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
214 by limiting the size of the data read in one chunk. The API here |
|
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
215 does not support that kind of protection. This also affects parse() |
|
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
216 since it can call parse_multipart(). |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
217 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
218 """ |
|
18833
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
219 boundary = "" |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
220 if 'boundary' in pdict: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
221 boundary = pdict['boundary'] |
|
18833
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
222 if not valid_boundary(boundary): |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
223 raise ValueError, ('Invalid boundary in multipart form: %r' |
|
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
224 % (boundary,)) |
|
19119
600a9a2b7a18
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
18833
diff
changeset
|
225 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
226 nextpart = "--" + boundary |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
227 lastpart = "--" + boundary + "--" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
228 partdict = {} |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
229 terminator = "" |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
230 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
231 while terminator != lastpart: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
232 bytes = -1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
233 data = None |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
234 if terminator: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
235 # At start of next part. Read headers first. |
|
35598
40ddf366f5a1
Reverted revision 1.83, which introduced a bug and subtle incompatibility
Armin Rigo <arigo@tunes.org>
parents:
35299
diff
changeset
|
236 headers = mimetools.Message(fp) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
237 clength = headers.getheader('content-length') |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
238 if clength: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
239 try: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
240 bytes = int(clength) |
|
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
241 except ValueError: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
242 pass |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
243 if bytes > 0: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
244 if maxlen and bytes > maxlen: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
245 raise ValueError, 'Maximum content length exceeded' |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
246 data = fp.read(bytes) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
247 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
248 data = "" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
249 # Read lines until end of part. |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
250 lines = [] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
251 while 1: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
252 line = fp.readline() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
253 if not line: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
254 terminator = lastpart # End outer loop |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
255 break |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
256 if line[:2] == "--": |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
257 terminator = line.strip() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
258 if terminator in (nextpart, lastpart): |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
259 break |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
260 lines.append(line) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
261 # Done with part. |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
262 if data is None: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
263 continue |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
264 if bytes < 0: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
265 if lines: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
266 # Strip final line terminator |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
267 line = lines[-1] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
268 if line[-2:] == "\r\n": |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
269 line = line[:-2] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
270 elif line[-1:] == "\n": |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
271 line = line[:-1] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
272 lines[-1] = line |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
273 data = "".join(lines) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
274 line = headers['content-disposition'] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
275 if not line: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
276 continue |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
277 key, params = parse_header(line) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
278 if key != 'form-data': |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
279 continue |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
280 if 'name' in params: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
281 name = params['name'] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
282 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
283 continue |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
284 if name in partdict: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
285 partdict[name].append(data) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
286 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
287 partdict[name] = [data] |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
288 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
289 return partdict |
| 2135 | 290 |
| 291 | |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
292 def parse_header(line): |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
293 """Parse a Content-type like header. |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
294 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
295 Return the main content-type and a dictionary of options. |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
296 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
297 """ |
| 34294 | 298 plist = [x.strip() for x in line.split(';')] |
|
24058
37ffce2d9c3c
Code modernization. Replace v=s[i]; del s[i] with single lookup v=s.pop(i)
Raymond Hettinger <python@rcn.com>
parents:
23620
diff
changeset
|
299 key = plist.pop(0).lower() |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
300 pdict = {} |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
301 for p in plist: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
302 i = p.find('=') |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
303 if i >= 0: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
304 name = p[:i].strip().lower() |
|
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
305 value = p[i+1:].strip() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
306 if len(value) >= 2 and value[0] == value[-1] == '"': |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
307 value = value[1:-1] |
|
33131
846ba2972d7c
Let cgi.parse_header() properly unquote headers (patch #1008597).
Johannes Gijsbers <jlg@dds.nl>
parents:
32758
diff
changeset
|
308 value = value.replace('\\\\', '\\').replace('\\"', '"') |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
309 pdict[name] = value |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
310 return key, pdict |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
311 |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
312 |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
313 # Classes for field storage |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
314 # ========================= |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
315 |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
316 class MiniFieldStorage: |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
317 |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
318 """Like FieldStorage, for use when no file uploads are possible.""" |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
319 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
320 # Dummy attributes |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
321 filename = None |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
322 list = None |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
323 type = None |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
324 file = None |
|
3447
db76fd390f74
Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents:
3446
diff
changeset
|
325 type_options = {} |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
326 disposition = None |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
327 disposition_options = {} |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
328 headers = {} |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
329 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
330 def __init__(self, name, value): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
331 """Constructor from field name and value.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
332 self.name = name |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
333 self.value = value |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
334 # self.file = StringIO(value) |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
335 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
336 def __repr__(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
337 """Return printable representation.""" |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
338 return "MiniFieldStorage(%r, %r)" % (self.name, self.value) |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
339 |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
340 |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
341 class FieldStorage: |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
342 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
343 """Store a sequence of fields, reading multipart/form-data. |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
344 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
345 This class provides naming, typing, files stored on disk, and |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
346 more. At the top level, it is accessible like a dictionary, whose |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
347 keys are the field names. (Note: None can occur as a field name.) |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
348 The items are either a Python list (if there's multiple values) or |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
349 another FieldStorage or MiniFieldStorage object. If it's a single |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
350 object, it has the following attributes: |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
351 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
352 name: the field name, if specified; otherwise None |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
353 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
354 filename: the filename, if specified; otherwise None; this is the |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
355 client side filename, *not* the file name on which it is |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
356 stored (that's a temporary file you don't deal with) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
357 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
358 value: the value as a *string*; for file uploads, this |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
359 transparently reads the file every time you request the value |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
360 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
361 file: the file(-like) object from which you can read the data; |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
362 None if the data is stored a simple string |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
363 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
364 type: the content-type, or None if not specified |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
365 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
366 type_options: dictionary of options specified on the content-type |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
367 line |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
368 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
369 disposition: content-disposition, or None if not specified |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
370 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
371 disposition_options: dictionary of corresponding options |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
372 |
|
35598
40ddf366f5a1
Reverted revision 1.83, which introduced a bug and subtle incompatibility
Armin Rigo <arigo@tunes.org>
parents:
35299
diff
changeset
|
373 headers: a dictionary(-like) object (sometimes rfc822.Message or a |
|
40ddf366f5a1
Reverted revision 1.83, which introduced a bug and subtle incompatibility
Armin Rigo <arigo@tunes.org>
parents:
35299
diff
changeset
|
374 subclass thereof) containing *all* headers |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
375 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
376 The class is subclassable, mostly for the purpose of overriding |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
377 the make_file() method, which is called internally to come up with |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
378 a file open for reading and writing. This makes it possible to |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
379 override the default choice of storing all files in a temporary |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
380 directory and unlinking them as soon as they have been opened. |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
381 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
382 """ |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
383 |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
384 def __init__(self, fp=None, headers=None, outerboundary="", |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
385 environ=os.environ, keep_blank_values=0, strict_parsing=0): |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
386 """Constructor. Read multipart/* until last part. |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
387 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
388 Arguments, all optional: |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
389 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
390 fp : file pointer; default: sys.stdin |
|
8284
f834e197bd14
Make Tim O'Malley's requested change: in FieldStorage.__init__(), when
Guido van Rossum <guido@python.org>
parents:
7755
diff
changeset
|
391 (not used when the request method is GET) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
392 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
393 headers : header dictionary-like object; default: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
394 taken from environ as per CGI spec |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
395 |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
396 outerboundary : terminating multipart boundary |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
397 (for internal use only) |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
398 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
399 environ : environment dictionary; default: os.environ |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
400 |
|
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
401 keep_blank_values: flag indicating whether blank values in |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
402 URL encoded forms should be treated as blank strings. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
403 A true value indicates that blanks should be retained as |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
404 blank strings. The default false value indicates that |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
405 blank values are to be ignored and treated as if they were |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
406 not included. |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
407 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
408 strict_parsing: flag indicating what to do with parsing errors. |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
409 If false (the default), errors are silently ignored. |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
410 If true, errors raise a ValueError exception. |
|
4534
d90d7b541ada
Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents:
4486
diff
changeset
|
411 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
412 """ |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
413 method = 'GET' |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
414 self.keep_blank_values = keep_blank_values |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
415 self.strict_parsing = strict_parsing |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
416 if 'REQUEST_METHOD' in environ: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
417 method = environ['REQUEST_METHOD'].upper() |
|
47798
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
418 self.qs_on_post = None |
|
8548
fac33716a218
Treat "HEAD" same as "GET", so that CGI scripts won't fail.
Guido van Rossum <guido@python.org>
parents:
8485
diff
changeset
|
419 if method == 'GET' or method == 'HEAD': |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
420 if 'QUERY_STRING' in environ: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
421 qs = environ['QUERY_STRING'] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
422 elif sys.argv[1:]: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
423 qs = sys.argv[1] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
424 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
425 qs = "" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
426 fp = StringIO(qs) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
427 if headers is None: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
428 headers = {'content-type': |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
429 "application/x-www-form-urlencoded"} |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
430 if headers is None: |
|
8485
7f94b4958056
Be more careful than the previous patch. The default content-type
Guido van Rossum <guido@python.org>
parents:
8477
diff
changeset
|
431 headers = {} |
|
7f94b4958056
Be more careful than the previous patch. The default content-type
Guido van Rossum <guido@python.org>
parents:
8477
diff
changeset
|
432 if method == 'POST': |
|
7f94b4958056
Be more careful than the previous patch. The default content-type
Guido van Rossum <guido@python.org>
parents:
8477
diff
changeset
|
433 # Set default content-type for POST to what's traditional |
|
7f94b4958056
Be more careful than the previous patch. The default content-type
Guido van Rossum <guido@python.org>
parents:
8477
diff
changeset
|
434 headers['content-type'] = "application/x-www-form-urlencoded" |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
435 if 'CONTENT_TYPE' in environ: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
436 headers['content-type'] = environ['CONTENT_TYPE'] |
|
47798
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
437 if 'QUERY_STRING' in environ: |
|
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
438 self.qs_on_post = environ['QUERY_STRING'] |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
439 if 'CONTENT_LENGTH' in environ: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
440 headers['content-length'] = environ['CONTENT_LENGTH'] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
441 self.fp = fp or sys.stdin |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
442 self.headers = headers |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
443 self.outerboundary = outerboundary |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
444 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
445 # Process content-disposition header |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
446 cdisp, pdict = "", {} |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
447 if 'content-disposition' in self.headers: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
448 cdisp, pdict = parse_header(self.headers['content-disposition']) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
449 self.disposition = cdisp |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
450 self.disposition_options = pdict |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
451 self.name = None |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
452 if 'name' in pdict: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
453 self.name = pdict['name'] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
454 self.filename = None |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
455 if 'filename' in pdict: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
456 self.filename = pdict['filename'] |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
457 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
458 # Process content-type header |
|
9821
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
459 # |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
460 # Honor any existing content-type header. But if there is no |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
461 # content-type header, use some sensible defaults. Assume |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
462 # outerboundary is "" at the outer level, but something non-false |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
463 # inside a multi-part. The default for an inner part is text/plain, |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
464 # but for an outer part it should be urlencoded. This should catch |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
465 # bogus clients which erroneously forget to include a content-type |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
466 # header. |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
467 # |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
468 # See below for what we do if there does exist a content-type header, |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
469 # but it happens to be something we don't understand. |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
470 if 'content-type' in self.headers: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
471 ctype, pdict = parse_header(self.headers['content-type']) |
|
10914
3fdf1c7d9f98
At Jim Fulton's request (actually, as a compromise :-), default the
Guido van Rossum <guido@python.org>
parents:
9821
diff
changeset
|
472 elif self.outerboundary or method != 'POST': |
|
9821
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
473 ctype, pdict = "text/plain", {} |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
474 else: |
|
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
475 ctype, pdict = 'application/x-www-form-urlencoded', {} |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
476 self.type = ctype |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
477 self.type_options = pdict |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
478 self.innerboundary = "" |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
479 if 'boundary' in pdict: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
480 self.innerboundary = pdict['boundary'] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
481 clen = -1 |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
482 if 'content-length' in self.headers: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
483 try: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
484 clen = int(self.headers['content-length']) |
|
22476
d77e748865ff
tighten up except - only ValueError can be raised in this situation
Skip Montanaro <skip@pobox.com>
parents:
21917
diff
changeset
|
485 except ValueError: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
486 pass |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
487 if maxlen and clen > maxlen: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
488 raise ValueError, 'Maximum content length exceeded' |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
489 self.length = clen |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
490 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
491 self.list = self.file = None |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
492 self.done = 0 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
493 if ctype == 'application/x-www-form-urlencoded': |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
494 self.read_urlencoded() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
495 elif ctype[:10] == 'multipart/': |
|
9410
620e02250c80
Patch by Jim Fulton, who writes:
Guido van Rossum <guido@python.org>
parents:
8548
diff
changeset
|
496 self.read_multi(environ, keep_blank_values, strict_parsing) |
|
10976
0f0a66c1deac
After more discussion with Jim, change the behavior so that only a
Guido van Rossum <guido@python.org>
parents:
10920
diff
changeset
|
497 else: |
|
9821
28d3a9fcb577
FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents:
9615
diff
changeset
|
498 self.read_single() |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
499 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
500 def __repr__(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
501 """Return a printable representation.""" |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
502 return "FieldStorage(%r, %r, %r)" % ( |
|
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
503 self.name, self.filename, self.value) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
504 |
|
25214
5330c0620810
Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents:
24058
diff
changeset
|
505 def __iter__(self): |
|
5330c0620810
Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents:
24058
diff
changeset
|
506 return iter(self.keys()) |
|
5330c0620810
Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents:
24058
diff
changeset
|
507 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
508 def __getattr__(self, name): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
509 if name != 'value': |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
510 raise AttributeError, name |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
511 if self.file: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
512 self.file.seek(0) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
513 value = self.file.read() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
514 self.file.seek(0) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
515 elif self.list is not None: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
516 value = self.list |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
517 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
518 value = None |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
519 return value |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
520 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
521 def __getitem__(self, key): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
522 """Dictionary style indexing.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
523 if self.list is None: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
524 raise TypeError, "not indexable" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
525 found = [] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
526 for item in self.list: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
527 if item.name == key: found.append(item) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
528 if not found: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
529 raise KeyError, key |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
530 if len(found) == 1: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
531 return found[0] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
532 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
533 return found |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
534 |
|
14196
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
535 def getvalue(self, key, default=None): |
|
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
536 """Dictionary style get() method, including 'value' lookup.""" |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
537 if key in self: |
|
14196
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
538 value = self[key] |
|
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
539 if type(value) is type([]): |
| 34294 | 540 return map(attrgetter('value'), value) |
|
14196
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
541 else: |
|
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
542 return value.value |
|
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
543 else: |
|
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
544 return default |
|
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
545 |
|
19744
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
546 def getfirst(self, key, default=None): |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
547 """ Return the first value received.""" |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
548 if key in self: |
|
19744
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
549 value = self[key] |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
550 if type(value) is type([]): |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
551 return value[0].value |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
552 else: |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
553 return value.value |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
554 else: |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
555 return default |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
556 |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
557 def getlist(self, key): |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
558 """ Return list of received values.""" |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
559 if key in self: |
|
19744
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
560 value = self[key] |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
561 if type(value) is type([]): |
| 34294 | 562 return map(attrgetter('value'), value) |
|
19744
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
563 else: |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
564 return [value.value] |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
565 else: |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
566 return [] |
|
f1430e3382bb
Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents:
19119
diff
changeset
|
567 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
568 def keys(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
569 """Dictionary style keys() method.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
570 if self.list is None: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
571 raise TypeError, "not indexable" |
|
43414
7d14a3188850
Patch #1541463: optimize performance of cgi.FieldStorage operations.
Georg Brandl <georg@python.org>
parents:
39931
diff
changeset
|
572 return list(set(item.name for item in self.list)) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
573 |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
574 def has_key(self, key): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
575 """Dictionary style has_key() method.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
576 if self.list is None: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
577 raise TypeError, "not indexable" |
|
43414
7d14a3188850
Patch #1541463: optimize performance of cgi.FieldStorage operations.
Georg Brandl <georg@python.org>
parents:
39931
diff
changeset
|
578 return any(item.name == key for item in self.list) |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
579 |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
580 def __contains__(self, key): |
|
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
581 """Dictionary style __contains__ method.""" |
|
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
582 if self.list is None: |
|
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
583 raise TypeError, "not indexable" |
|
43414
7d14a3188850
Patch #1541463: optimize performance of cgi.FieldStorage operations.
Georg Brandl <georg@python.org>
parents:
39931
diff
changeset
|
584 return any(item.name == key for item in self.list) |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
585 |
| 4931 | 586 def __len__(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
587 """Dictionary style len(x) support.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
588 return len(self.keys()) |
| 4931 | 589 |
|
43414
7d14a3188850
Patch #1541463: optimize performance of cgi.FieldStorage operations.
Georg Brandl <georg@python.org>
parents:
39931
diff
changeset
|
590 def __nonzero__(self): |
|
7d14a3188850
Patch #1541463: optimize performance of cgi.FieldStorage operations.
Georg Brandl <georg@python.org>
parents:
39931
diff
changeset
|
591 return bool(self.list) |
|
7d14a3188850
Patch #1541463: optimize performance of cgi.FieldStorage operations.
Georg Brandl <georg@python.org>
parents:
39931
diff
changeset
|
592 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
593 def read_urlencoded(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
594 """Internal: read data in query string format.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
595 qs = self.fp.read(self.length) |
|
47798
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
596 if self.qs_on_post: |
|
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
597 qs += '&' + self.qs_on_post |
|
10920
3faa63430924
Patch by Jim Fulton: new function parse_qsl(), which is like
Guido van Rossum <guido@python.org>
parents:
10914
diff
changeset
|
598 self.list = list = [] |
|
48995
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
599 for key, value in urlparse.parse_qsl(qs, self.keep_blank_values, |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
600 self.strict_parsing): |
|
10920
3faa63430924
Patch by Jim Fulton: new function parse_qsl(), which is like
Guido van Rossum <guido@python.org>
parents:
10914
diff
changeset
|
601 list.append(MiniFieldStorage(key, value)) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
602 self.skip_lines() |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
603 |
|
9615
c03787ec9811
In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents:
9410
diff
changeset
|
604 FieldStorageClass = None |
|
c03787ec9811
In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents:
9410
diff
changeset
|
605 |
|
9410
620e02250c80
Patch by Jim Fulton, who writes:
Guido van Rossum <guido@python.org>
parents:
8548
diff
changeset
|
606 def read_multi(self, environ, keep_blank_values, strict_parsing): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
607 """Internal: read a part that is itself multipart.""" |
|
18833
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
608 ib = self.innerboundary |
|
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
609 if not valid_boundary(ib): |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
610 raise ValueError, 'Invalid boundary in multipart form: %r' % (ib,) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
611 self.list = [] |
|
47798
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
612 if self.qs_on_post: |
|
48995
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
613 for key, value in urlparse.parse_qsl(self.qs_on_post, |
|
2b855a947f0f
Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents:
48948
diff
changeset
|
614 self.keep_blank_values, self.strict_parsing): |
|
47798
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
615 self.list.append(MiniFieldStorage(key, value)) |
|
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
616 FieldStorageClass = None |
|
5e8a7f9d9523
Now a from submitted via POST that also has a query string
Facundo Batista <facundobatista@gmail.com>
parents:
43414
diff
changeset
|
617 |
|
9615
c03787ec9811
In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents:
9410
diff
changeset
|
618 klass = self.FieldStorageClass or self.__class__ |
|
18833
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
619 part = klass(self.fp, {}, ib, |
|
9615
c03787ec9811
In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents:
9410
diff
changeset
|
620 environ, keep_blank_values, strict_parsing) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
621 # Throw first part away |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
622 while not part.done: |
|
35598
40ddf366f5a1
Reverted revision 1.83, which introduced a bug and subtle incompatibility
Armin Rigo <arigo@tunes.org>
parents:
35299
diff
changeset
|
623 headers = rfc822.Message(self.fp) |
|
18833
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
624 part = klass(self.fp, headers, ib, |
|
9615
c03787ec9811
In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents:
9410
diff
changeset
|
625 environ, keep_blank_values, strict_parsing) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
626 self.list.append(part) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
627 self.skip_lines() |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
628 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
629 def read_single(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
630 """Internal: read an atomic part.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
631 if self.length >= 0: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
632 self.read_binary() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
633 self.skip_lines() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
634 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
635 self.read_lines() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
636 self.file.seek(0) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
637 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
638 bufsize = 8*1024 # I/O buffering size for copy to file |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
639 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
640 def read_binary(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
641 """Internal: read binary data.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
642 self.file = self.make_file('b') |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
643 todo = self.length |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
644 if todo >= 0: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
645 while todo > 0: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
646 data = self.fp.read(min(todo, self.bufsize)) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
647 if not data: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
648 self.done = -1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
649 break |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
650 self.file.write(data) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
651 todo = todo - len(data) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
652 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
653 def read_lines(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
654 """Internal: read lines until EOF or outerboundary.""" |
|
18337
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
655 self.file = self.__file = StringIO() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
656 if self.outerboundary: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
657 self.read_lines_to_outerboundary() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
658 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
659 self.read_lines_to_eof() |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
660 |
|
18337
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
661 def __write(self, line): |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
662 if self.__file is not None: |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
663 if self.__file.tell() + len(line) > 1000: |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
664 self.file = self.make_file('') |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
665 self.file.write(self.__file.getvalue()) |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
666 self.__file = None |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
667 self.file.write(line) |
|
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
668 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
669 def read_lines_to_eof(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
670 """Internal: read lines until EOF.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
671 while 1: |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
672 line = self.fp.readline(1<<16) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
673 if not line: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
674 self.done = -1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
675 break |
|
18337
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
676 self.__write(line) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
677 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
678 def read_lines_to_outerboundary(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
679 """Internal: read lines until outerboundary.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
680 next = "--" + self.outerboundary |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
681 last = next + "--" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
682 delim = "" |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
683 last_line_lfend = True |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
684 while 1: |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
685 line = self.fp.readline(1<<16) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
686 if not line: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
687 self.done = -1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
688 break |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
689 if line[:2] == "--" and last_line_lfend: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
690 strippedline = line.strip() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
691 if strippedline == next: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
692 break |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
693 if strippedline == last: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
694 self.done = 1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
695 break |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
696 odelim = delim |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
697 if line[-2:] == "\r\n": |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
698 delim = "\r\n" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
699 line = line[:-2] |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
700 last_line_lfend = True |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
701 elif line[-1] == "\n": |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
702 delim = "\n" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
703 line = line[:-1] |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
704 last_line_lfend = True |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
705 else: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
706 delim = "" |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
707 last_line_lfend = False |
|
18337
c2a60de91d2c
Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents:
17074
diff
changeset
|
708 self.__write(odelim + line) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
709 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
710 def skip_lines(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
711 """Internal: skip lines until outer boundary if defined.""" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
712 if not self.outerboundary or self.done: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
713 return |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
714 next = "--" + self.outerboundary |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
715 last = next + "--" |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
716 last_line_lfend = True |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
717 while 1: |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
718 line = self.fp.readline(1<<16) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
719 if not line: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
720 self.done = -1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
721 break |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
722 if line[:2] == "--" and last_line_lfend: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
723 strippedline = line.strip() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
724 if strippedline == next: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
725 break |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
726 if strippedline == last: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
727 self.done = 1 |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
728 break |
|
39427
9f08516a4d0c
Chris McDonough's patch to defend against certain DoS attacks on FieldStorage.
Guido van Rossum <guido@python.org>
parents:
35598
diff
changeset
|
729 last_line_lfend = line.endswith('\n') |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
730 |
|
5988
5993a099d9b0
Changes suggested by Jim fulton:
Guido van Rossum <guido@python.org>
parents:
5870
diff
changeset
|
731 def make_file(self, binary=None): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
732 """Overridable: return a readable & writable file. |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
733 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
734 The file will be used as follows: |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
735 - data is written to it |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
736 - seek(0) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
737 - data is read from it |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
738 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
739 The 'binary' argument is unused -- the file is always opened |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
740 in binary mode. |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
741 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
742 This version opens a temporary file for reading and writing, |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
743 and immediately deletes (unlinks) it. The trick (on Unix!) is |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
744 that the file can still be used, but it can't be opened by |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
745 another process, and it will automatically be deleted when it |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
746 is closed or when the current process terminates. |
|
3447
db76fd390f74
Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents:
3446
diff
changeset
|
747 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
748 If you want a more permanent file, you derive a class which |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
749 overrides this method. If you want a visible temporary file |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
750 that is nevertheless automatically deleted when the script |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
751 terminates, try defining a __del__ method in a derived class |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
752 which unlinks the temporary files you have created. |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
753 |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
754 """ |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
755 import tempfile |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
756 return tempfile.TemporaryFile("w+b") |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
757 |
|
3437
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
758 |
|
d70149202c93
Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents:
3435
diff
changeset
|
759 |
|
3447
db76fd390f74
Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents:
3446
diff
changeset
|
760 # Backwards Compatibility Classes |
|
db76fd390f74
Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents:
3446
diff
changeset
|
761 # =============================== |
| 2135 | 762 |
|
14196
41234ae95d2a
Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13840
diff
changeset
|
763 class FormContentDict(UserDict.UserDict): |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
764 """Form content as dictionary with a list of values per field. |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
765 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
766 form = FormContentDict() |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
767 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
768 form[key] -> [value, value, ...] |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
769 key in form -> Boolean |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
770 form.keys() -> [key, key, ...] |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
771 form.values() -> [[val, val, ...], [val, val, ...], ...] |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
772 form.items() -> [(key, [val, val, ...]), (key, [val, val, ...]), ...] |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
773 form.dict == {key: [val, val, ...], ...} |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
774 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
775 """ |
|
39931
ffb901374a38
Bug #1457823: cgi.(Sv)FormContentDict's constructor now takes
Georg Brandl <georg@python.org>
parents:
39427
diff
changeset
|
776 def __init__(self, environ=os.environ, keep_blank_values=0, strict_parsing=0): |
|
ffb901374a38
Bug #1457823: cgi.(Sv)FormContentDict's constructor now takes
Georg Brandl <georg@python.org>
parents:
39427
diff
changeset
|
777 self.dict = self.data = parse(environ=environ, |
|
ffb901374a38
Bug #1457823: cgi.(Sv)FormContentDict's constructor now takes
Georg Brandl <georg@python.org>
parents:
39427
diff
changeset
|
778 keep_blank_values=keep_blank_values, |
|
ffb901374a38
Bug #1457823: cgi.(Sv)FormContentDict's constructor now takes
Georg Brandl <georg@python.org>
parents:
39427
diff
changeset
|
779 strict_parsing=strict_parsing) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
780 self.query_string = environ['QUERY_STRING'] |
| 2135 | 781 |
| 782 | |
| 783 class SvFormContentDict(FormContentDict): | |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
784 """Form content as dictionary expecting a single value per field. |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
785 |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
786 If you only expect a single value for each field, then form[key] |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
787 will return that single value. It will raise an IndexError if |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
788 that expectation is not true. If you expect a field to have |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
789 possible multiple values, than you can use form.getlist(key) to |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
790 get all of the values. values() and items() are a compromise: |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
791 they return single strings where there is a single value, and |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
792 lists of strings otherwise. |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
793 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
794 """ |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
795 def __getitem__(self, key): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
796 if len(self.dict[key]) > 1: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
797 raise IndexError, 'expecting a single value' |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
798 return self.dict[key][0] |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
799 def getlist(self, key): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
800 return self.dict[key] |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
801 def values(self): |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
802 result = [] |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
803 for value in self.dict.values(): |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
804 if len(value) == 1: |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
805 result.append(value[0]) |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
806 else: result.append(value) |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
807 return result |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
808 def items(self): |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
809 result = [] |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
810 for key, value in self.dict.items(): |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
811 if len(value) == 1: |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
812 result.append((key, value[0])) |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
813 else: result.append((key, value)) |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
814 return result |
| 2135 | 815 |
| 816 | |
| 817 class InterpFormContentDict(SvFormContentDict): | |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
818 """This class is present for backwards compatibility only.""" |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
819 def __getitem__(self, key): |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
820 v = SvFormContentDict.__getitem__(self, key) |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
821 if v[0] in '0123456789+-.': |
|
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
822 try: return int(v) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
823 except ValueError: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
824 try: return float(v) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
825 except ValueError: pass |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
826 return v.strip() |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
827 def values(self): |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
828 result = [] |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
829 for key in self.keys(): |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
830 try: |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
831 result.append(self[key]) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
832 except IndexError: |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
833 result.append(self.dict[key]) |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
834 return result |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
835 def items(self): |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
836 result = [] |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
837 for key in self.keys(): |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
838 try: |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
839 result.append((key, self[key])) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
840 except IndexError: |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
841 result.append((key, self.dict[key])) |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
842 return result |
| 2135 | 843 |
| 844 | |
| 845 class FormContent(FormContentDict): | |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
846 """This class is present for backwards compatibility only.""" |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
847 def values(self, key): |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
848 if key in self.dict :return self.dict[key] |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
849 else: return None |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
850 def indexed_value(self, key, location): |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
851 if key in self.dict: |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
852 if len(self.dict[key]) > location: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
853 return self.dict[key][location] |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
854 else: return None |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
855 else: return None |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
856 def value(self, key): |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
857 if key in self.dict: return self.dict[key][0] |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
858 else: return None |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
859 def length(self, key): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
860 return len(self.dict[key]) |
|
3446
623ba9bdeb22
Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents:
3444
diff
changeset
|
861 def stripped(self, key): |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23609
diff
changeset
|
862 if key in self.dict: return self.dict[key][0].strip() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
863 else: return None |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
864 def pars(self): |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
865 return self.dict |
| 2135 | 866 |
| 867 | |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
868 # Test/debug code |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
869 # =============== |
| 2135 | 870 |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
871 def test(environ=os.environ): |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
872 """Robust test CGI script, usable as main program. |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
873 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
874 Write minimal HTTP headers and dump all information provided to |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
875 the script in HTML form. |
| 2135 | 876 |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
877 """ |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
878 print "Content-type: text/html" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
879 print |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
880 sys.stderr = sys.stdout |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
881 try: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
882 form = FieldStorage() # Replace with other classes to test those |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
883 print_directory() |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
884 print_arguments() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
885 print_form(form) |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
886 print_environ(environ) |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
887 print_environ_usage() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
888 def f(): |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
889 exec "testing print_exception() -- <I>italics?</I>" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
890 def g(f=f): |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
891 f() |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
892 print "<H3>What follows is a test, not an actual exception:</H3>" |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
893 g() |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
894 except: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
895 print_exception() |
|
4072
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
896 |
|
14645
2d30c35feebe
Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents:
14606
diff
changeset
|
897 print "<H1>Second try with a small maxlen...</H1>" |
|
2d30c35feebe
Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents:
14606
diff
changeset
|
898 |
|
5499
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
899 global maxlen |
|
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
900 maxlen = 50 |
|
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
901 try: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
902 form = FieldStorage() # Replace with other classes to test those |
|
14677
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
903 print_directory() |
|
a7813ad73a4e
Patch #101121, by Ka-Ping Yee: cosmetic cleanup of cgi.py, using my
Guido van Rossum <guido@python.org>
parents:
14645
diff
changeset
|
904 print_arguments() |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
905 print_form(form) |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
906 print_environ(environ) |
|
5499
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
907 except: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
908 print_exception() |
|
5499
b905372edd4f
Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents:
5302
diff
changeset
|
909 |
|
4072
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
910 def print_exception(type=None, value=None, tb=None, limit=None): |
|
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
911 if type is None: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
912 type, value, tb = sys.exc_info() |
|
4072
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
913 import traceback |
|
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
914 print |
|
15669
5c65e676f299
Make Traceback header conform to new traceback ("innermost last" ->
Guido van Rossum <guido@python.org>
parents:
15382
diff
changeset
|
915 print "<H3>Traceback (most recent call last):</H3>" |
|
4072
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
916 list = traceback.format_tb(tb, limit) + \ |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
917 traceback.format_exception_only(type, value) |
|
4072
f66562536f11
Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents:
3958
diff
changeset
|
918 print "<PRE>%s<B>%s</B></PRE>" % ( |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
919 escape("".join(list[:-1])), |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
920 escape(list[-1]), |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
921 ) |
|
6347
2656d1eea792
Use sys.exc_info() where needed.
Guido van Rossum <guido@python.org>
parents:
5988
diff
changeset
|
922 del tb |
| 2135 | 923 |
|
3794
d1c47f4f1541
Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents:
3630
diff
changeset
|
924 def print_environ(environ=os.environ): |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
925 """Dump the shell environment as HTML.""" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
926 keys = environ.keys() |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
927 keys.sort() |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
928 print |
|
3629
e54d39107249
capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents:
3451
diff
changeset
|
929 print "<H3>Shell Environment:</H3>" |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
930 print "<DL>" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
931 for key in keys: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
932 print "<DT>", escape(key), "<DD>", escape(environ[key]) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
933 print "</DL>" |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
934 print |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
935 |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
936 def print_form(form): |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
937 """Dump the contents of a form as HTML.""" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
938 keys = form.keys() |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
939 keys.sort() |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
940 print |
|
3629
e54d39107249
capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents:
3451
diff
changeset
|
941 print "<H3>Form Contents:</H3>" |
|
14645
2d30c35feebe
Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents:
14606
diff
changeset
|
942 if not keys: |
|
2d30c35feebe
Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents:
14606
diff
changeset
|
943 print "<P>No form fields." |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
944 print "<DL>" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
945 for key in keys: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
946 print "<DT>" + escape(key) + ":", |
|
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
947 value = form[key] |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
948 print "<i>" + escape(repr(type(value))) + "</i>" |
|
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
28089
diff
changeset
|
949 print "<DD>" + escape(repr(value)) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
950 print "</DL>" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
951 print |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
952 |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
953 def print_directory(): |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
954 """Dump the current directory as HTML.""" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
955 print |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
956 print "<H3>Current Working Directory:</H3>" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
957 try: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
958 pwd = os.getcwd() |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
959 except os.error, msg: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
960 print "os.error:", escape(str(msg)) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
961 else: |
|
7755
fb4b4d069cc7
Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents:
6941
diff
changeset
|
962 print escape(pwd) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
963 print |
| 2135 | 964 |
|
3451
5abbc9b5fdf0
Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents:
3447
diff
changeset
|
965 def print_arguments(): |
|
5abbc9b5fdf0
Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents:
3447
diff
changeset
|
966 print |
|
3629
e54d39107249
capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents:
3451
diff
changeset
|
967 print "<H3>Command Line Arguments:</H3>" |
|
3451
5abbc9b5fdf0
Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents:
3447
diff
changeset
|
968 print |
|
5abbc9b5fdf0
Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents:
3447
diff
changeset
|
969 print sys.argv |
|
5abbc9b5fdf0
Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents:
3447
diff
changeset
|
970 print |
|
5abbc9b5fdf0
Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents:
3447
diff
changeset
|
971 |
| 2135 | 972 def print_environ_usage(): |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
973 """Dump a list of environment variables used by CGI as HTML.""" |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
974 print """ |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
975 <H3>These environment variables could have been set:</H3> |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
976 <UL> |
| 2135 | 977 <LI>AUTH_TYPE |
| 978 <LI>CONTENT_LENGTH | |
| 979 <LI>CONTENT_TYPE | |
| 980 <LI>DATE_GMT | |
| 981 <LI>DATE_LOCAL | |
| 982 <LI>DOCUMENT_NAME | |
| 983 <LI>DOCUMENT_ROOT | |
| 984 <LI>DOCUMENT_URI | |
| 985 <LI>GATEWAY_INTERFACE | |
| 986 <LI>LAST_MODIFIED | |
| 987 <LI>PATH | |
| 988 <LI>PATH_INFO | |
| 989 <LI>PATH_TRANSLATED | |
| 990 <LI>QUERY_STRING | |
| 991 <LI>REMOTE_ADDR | |
| 992 <LI>REMOTE_HOST | |
| 993 <LI>REMOTE_IDENT | |
| 994 <LI>REMOTE_USER | |
| 995 <LI>REQUEST_METHOD | |
| 996 <LI>SCRIPT_NAME | |
| 997 <LI>SERVER_NAME | |
| 998 <LI>SERVER_PORT | |
| 999 <LI>SERVER_PROTOCOL | |
| 1000 <LI>SERVER_ROOT | |
| 1001 <LI>SERVER_SOFTWARE | |
| 1002 </UL> | |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1003 In addition, HTTP headers sent by the server may be passed in the |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1004 environment as well. Here are some common variable names: |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1005 <UL> |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1006 <LI>HTTP_ACCEPT |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1007 <LI>HTTP_CONNECTION |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1008 <LI>HTTP_HOST |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1009 <LI>HTTP_PRAGMA |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1010 <LI>HTTP_REFERER |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1011 <LI>HTTP_USER_AGENT |
|
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1012 </UL> |
| 2135 | 1013 """ |
| 1014 | |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1015 |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1016 # Utilities |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1017 # ========= |
| 2135 | 1018 |
|
5870
fe4f1eb14d53
Add optional 'quote' flag argument to escape(); if true, translate '"'
Guido van Rossum <guido@python.org>
parents:
5654
diff
changeset
|
1019 def escape(s, quote=None): |
|
35299
5a9134fe5709
Bring cgi.escape docstring slightly more in line with the library ref
Skip Montanaro <skip@pobox.com>
parents:
34367
diff
changeset
|
1020 '''Replace special characters "&", "<" and ">" to HTML-safe sequences. |
|
5a9134fe5709
Bring cgi.escape docstring slightly more in line with the library ref
Skip Montanaro <skip@pobox.com>
parents:
34367
diff
changeset
|
1021 If the optional flag quote is true, the quotation mark character (") |
|
5a9134fe5709
Bring cgi.escape docstring slightly more in line with the library ref
Skip Montanaro <skip@pobox.com>
parents:
34367
diff
changeset
|
1022 is also translated.''' |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
1023 s = s.replace("&", "&") # Must be done first! |
|
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
1024 s = s.replace("<", "<") |
|
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
1025 s = s.replace(">", ">") |
|
5870
fe4f1eb14d53
Add optional 'quote' flag argument to escape(); if true, translate '"'
Guido van Rossum <guido@python.org>
parents:
5654
diff
changeset
|
1026 if quote: |
|
16503
8d7655ac8bf8
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16070
diff
changeset
|
1027 s = s.replace('"', """) |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1028 return s |
| 2135 | 1029 |
|
18833
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
1030 def valid_boundary(s, _vb_pattern="^[ -~]{0,200}[!-~]$"): |
|
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
1031 import re |
|
3cc66750687d
Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents:
18337
diff
changeset
|
1032 return re.match(_vb_pattern, s) |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1033 |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1034 # Invoke mainline |
|
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1035 # =============== |
| 2135 | 1036 |
|
3432
6abc75ec6d29
File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents:
3106
diff
changeset
|
1037 # Call test() when this file is run as a script (not imported as a module) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15669
diff
changeset
|
1038 if __name__ == '__main__': |
|
3444
e76ca34d48f3
Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents:
3437
diff
changeset
|
1039 test() |
