annotate Lib/cgi.py @ 49961:e793fc3c8abe

More 3.0 -> 3.1 transistion in the Windows and OS/2 build files
author Christian Heimes <christian@cheimes.de>
date Thu, 04 Dec 2008 14:27:25 +0000
parents c46bcccf2af2
children 89e738c792c0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14989
2b4236580e0c Undo Ping's change.
Guido van Rossum <guido@python.org>
parents: 14988
diff changeset
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
11870
d7eca5b0960a Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents: 11849
diff changeset
18 # History
d7eca5b0960a Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents: 11849
diff changeset
19 # -------
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
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 # 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
22 # 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
23 # 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
24 # 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
25 # responsible for its maintenance.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
26 #
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
27
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
28 __version__ = "2.6"
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
29
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
30
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
31 # Imports
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
32 # =======
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
33
34294
3e9a4d531e56 Remove some lambdas.
Raymond Hettinger <python@rcn.com>
parents: 34293
diff changeset
34 from operator import attrgetter
47632
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
35 from io import StringIO
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
36 import sys
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
37 import os
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47643
diff changeset
38 import urllib.parse
47632
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
39 import email.parser
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
40 from warnings import warn
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
41
46915
e94574455d9d Remove old backwards-compatibility classes from the cgi module.
Georg Brandl <georg@python.org>
parents: 45156
diff changeset
42 __all__ = ["MiniFieldStorage", "FieldStorage",
17074
8323b098c6ce Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents: 16821
diff changeset
43 "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
44 "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
45 "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
46 "print_environ_usage", "escape"]
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
47
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
48 # Logging support
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
49 # ===============
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
50
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
51 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
52 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
53
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
54 def initlog(*allargs):
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
55 """Write a log message, if there is a log file.
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
56
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
57 Even though this function is called initlog(), you should always
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
58 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
59 (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
60 nolog (when logging is disabled).
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
61
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
62 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
63 any) are arguments to the % operator, so e.g.
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
64 log("%s: %s", "a", "b")
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
65 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
66
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
67 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
68 which log data is written.
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
69
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
70 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
71 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
72 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
73 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
74 send an error message).
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
75
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
76 """
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
77 global logfp, log
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
78 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
79 try:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
80 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
81 except IOError:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
82 pass
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
83 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
84 log = nolog
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
85 else:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
86 log = dolog
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 25214
diff changeset
87 log(*allargs)
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
88
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
89 def dolog(fmt, *args):
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
90 """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
91 logfp.write(fmt%args + "\n")
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
92
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
93 def nolog(*allargs):
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
94 """Dummy function, assigned to log when logging is disabled."""
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
95 pass
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
96
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
97 log = initlog # The current logging function
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
98
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
99
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
100 # Parsing functions
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
101 # =================
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
102
5499
b905372edd4f Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents: 5302
diff changeset
103 # 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
104 # 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
105 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
106
4534
d90d7b541ada Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents: 4486
diff changeset
107 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
108 """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
109
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
110 Arguments, all optional:
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
111
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
112 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
113
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
114 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
115
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
116 keep_blank_values: flag indicating whether blank values in
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
117 URL encoded forms should be treated as blank strings.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
118 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
119 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
120 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
121 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
122
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
123 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
124 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
125 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
126 """
23609
456d58451fee Use is None rather than general boolean
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
127 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
128 fp = sys.stdin
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
129 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
130 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
131 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
132 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
133 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
134 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
135 elif ctype == 'application/x-www-form-urlencoded':
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
136 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
137 if maxlen and clength > maxlen:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
138 raise ValueError('Maximum content length exceeded')
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
139 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
140 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
141 qs = '' # Unknown content-type
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
142 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
143 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
144 qs = qs + environ['QUERY_STRING']
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
145 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
146 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
147 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
148 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
149 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
150 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
151 else:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
152 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
153 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
154 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
155 qs = ""
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
156 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
157 return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing)
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
158
2918
cfa9b3a84872 added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents: 2538
diff changeset
159
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
160 # parse query string function called from urlparse,
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
161 # this is done in order to maintain backward compatiblity.
2918
cfa9b3a84872 added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents: 2538
diff changeset
162
4534
d90d7b541ada Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents: 4486
diff changeset
163 def parse_qs(qs, keep_blank_values=0, strict_parsing=0):
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
164 """Parse a query given as a string argument."""
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
165 warn("cgi.parse_qs is deprecated, use urllib.parse.parse_qs instead",
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
166 DeprecationWarning)
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
167 return urllib.parse.parse_qs(qs, keep_blank_values, 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
168
3faa63430924 Patch by Jim Fulton: new function parse_qsl(), which is like
Guido van Rossum <guido@python.org>
parents: 10914
diff changeset
169 def parse_qsl(qs, keep_blank_values=0, strict_parsing=0):
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
170 """Parse a query given as a string argument."""
49101
c46bcccf2af2 Added a warning filter to don't show the warning during
Facundo Batista <facundobatista@gmail.com>
parents: 48998
diff changeset
171 warn("cgi.parse_qsl is deprecated, use urllib.parse.parse_qsl instead",
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
172 DeprecationWarning)
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
173 return urllib.parse.parse_qsl(qs, keep_blank_values, strict_parsing)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
174
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
175 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
176 """Parse multipart input.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
177
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
178 Arguments:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
179 fp : input file
34367
5cd4fffaf910 Patch #1079734: remove dependencies on (deprecated) rfc822 and mimetools
Johannes Gijsbers <jlg@dds.nl>
parents: 34294
diff changeset
180 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
181
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
182 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
183 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
184 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
185 use the FieldStorage class instead which is much more flexible. Note
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
186 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
187 header.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
188
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
189 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
190 that.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
191
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
192 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
193 point in having two implementations of the same parsing algorithm.
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
194 Also, FieldStorage protects itself better against certain DoS attacks
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
195 by limiting the size of the data read in one chunk. The API here
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
196 does not support that kind of protection. This also affects parse()
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
197 since it can call parse_multipart().
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
198
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
199 """
47635
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47632
diff changeset
200 import http.client
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47632
diff changeset
201
18833
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
202 boundary = ""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
203 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
204 boundary = pdict['boundary']
18833
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
205 if not valid_boundary(boundary):
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
206 raise ValueError('Invalid boundary in multipart form: %r'
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
207 % (boundary,))
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18833
diff changeset
208
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
209 nextpart = "--" + boundary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
210 lastpart = "--" + boundary + "--"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
211 partdict = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
212 terminator = ""
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
213
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
214 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
215 bytes = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
216 data = None
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
217 if terminator:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
218 # At start of next part. Read headers first.
47635
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47632
diff changeset
219 headers = http.client.parse_headers(fp)
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47632
diff changeset
220 clength = headers.get('content-length')
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
221 if clength:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
222 try:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
223 bytes = int(clength)
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
224 except ValueError:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
225 pass
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
226 if bytes > 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
227 if maxlen and bytes > maxlen:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
228 raise ValueError('Maximum content length exceeded')
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
229 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
230 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
231 data = ""
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
232 # 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
233 lines = []
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
234 while 1:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
235 line = fp.readline()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
236 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
237 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
238 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
239 if line[:2] == "--":
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
240 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
241 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
242 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
243 lines.append(line)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
244 # Done with part.
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
245 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
246 continue
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
247 if bytes < 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
248 if lines:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
249 # 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
250 line = lines[-1]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
251 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
252 line = line[:-2]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
253 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
254 line = line[:-1]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
255 lines[-1] = line
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
256 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
257 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
258 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
259 continue
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
260 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
261 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
262 continue
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
263 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
264 name = params['name']
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
265 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
266 continue
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
267 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
268 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
269 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
270 partdict[name] = [data]
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
271
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
272 return partdict
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
273
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
274
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
275 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
276 """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
277
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
278 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
279
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
280 """
34294
3e9a4d531e56 Remove some lambdas.
Raymond Hettinger <python@rcn.com>
parents: 34293
diff changeset
281 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
282 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
283 pdict = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
284 for p in plist:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
285 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
286 if i >= 0:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
287 name = p[:i].strip().lower()
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
288 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
289 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
290 value = value[1:-1]
33131
846ba2972d7c Let cgi.parse_header() properly unquote headers (patch #1008597).
Johannes Gijsbers <jlg@dds.nl>
parents: 32758
diff changeset
291 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
292 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
293 return key, pdict
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
294
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
295
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
296 # Classes for field storage
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
297 # =========================
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
298
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
299 class MiniFieldStorage:
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
300
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
301 """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
302
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
303 # Dummy attributes
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
304 filename = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
305 list = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
306 type = None
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
307 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
308 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
309 disposition = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
310 disposition_options = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
311 headers = {}
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
312
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
313 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
314 """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
315 self.name = name
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
316 self.value = value
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
317 # self.file = StringIO(value)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
318
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
319 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
320 """Return printable representation."""
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
321 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
322
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
323
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
324 class FieldStorage:
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
325
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
326 """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
327
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
328 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
329 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
330 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
331 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
332 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
333 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
334
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
335 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
336
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
337 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
338 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
339 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
340
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
341 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
342 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
343
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
344 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
345 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
346
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
347 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
348
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
349 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
350 line
3444
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 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
353
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
354 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
355
47632
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
356 headers: a dictionary(-like) object (sometimes email.message.Message or a
35598
40ddf366f5a1 Reverted revision 1.83, which introduced a bug and subtle incompatibility
Armin Rigo <arigo@tunes.org>
parents: 35299
diff changeset
357 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
358
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
359 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
360 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
361 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
362 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
363 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
364
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
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
367 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
368 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
369 """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
370
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
371 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
372
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
373 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
374 (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
375
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
376 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
377 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
378
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
379 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
380 (for internal use only)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
381
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
382 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
383
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
384 keep_blank_values: flag indicating whether blank values in
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
385 URL encoded forms should be treated as blank strings.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
386 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
387 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
388 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
389 not included.
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
390
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
391 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
392 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
393 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
394
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
395 """
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
396 method = 'GET'
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
397 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
398 self.strict_parsing = strict_parsing
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
399 if 'REQUEST_METHOD' in environ:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
400 method = environ['REQUEST_METHOD'].upper()
48410
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
401 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
402 if method == 'GET' or method == 'HEAD':
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
403 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
404 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
405 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
406 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
407 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
408 qs = ""
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
409 fp = StringIO(qs)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
410 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
411 headers = {'content-type':
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
412 "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
413 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
414 headers = {}
7f94b4958056 Be more careful than the previous patch. The default content-type
Guido van Rossum <guido@python.org>
parents: 8477
diff changeset
415 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
416 # 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
417 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
418 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
419 headers['content-type'] = environ['CONTENT_TYPE']
48410
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
420 if 'QUERY_STRING' in environ:
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
421 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
422 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
423 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
424 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
425 self.headers = headers
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
426 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
427
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
428 # 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
429 cdisp, pdict = "", {}
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
430 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
431 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
432 self.disposition = cdisp
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
433 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
434 self.name = None
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
435 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
436 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
437 self.filename = None
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
438 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
439 self.filename = pdict['filename']
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
440
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
441 # 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
442 #
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
443 # 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
444 # 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
445 # 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
446 # 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
447 # 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
448 # 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
449 # header.
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
450 #
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
451 # 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
452 # 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
453 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
454 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
455 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
456 ctype, pdict = "text/plain", {}
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
457 else:
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
458 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
459 self.type = ctype
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
460 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
461 self.innerboundary = ""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
462 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
463 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
464 clen = -1
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
465 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
466 try:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
467 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
468 except ValueError:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
469 pass
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
470 if maxlen and clen > maxlen:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
471 raise ValueError('Maximum content length exceeded')
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
472 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
473
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
474 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
475 self.done = 0
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
476 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
477 self.read_urlencoded()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
478 elif ctype[:10] == 'multipart/':
9410
620e02250c80 Patch by Jim Fulton, who writes:
Guido van Rossum <guido@python.org>
parents: 8548
diff changeset
479 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
480 else:
9821
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
481 self.read_single()
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
482
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
483 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
484 """Return a printable representation."""
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
485 return "FieldStorage(%r, %r, %r)" % (
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
486 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
487
25214
5330c0620810 Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents: 24058
diff changeset
488 def __iter__(self):
5330c0620810 Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents: 24058
diff changeset
489 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
490
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
491 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
492 if name != 'value':
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
493 raise AttributeError(name)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
494 if self.file:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
495 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
496 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
497 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
498 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
499 value = self.list
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
500 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
501 value = None
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
502 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
503
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
504 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
505 """Dictionary style indexing."""
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
506 if self.list is None:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
507 raise TypeError("not indexable")
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
508 found = []
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
509 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
510 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
511 if not found:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
512 raise KeyError(key)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
513 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
514 return found[0]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
515 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
516 return found
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
517
14196
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
518 def getvalue(self, key, default=None):
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
519 """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
520 if key in self:
14196
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
521 value = self[key]
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
522 if type(value) is type([]):
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41760
diff changeset
523 return [x.value for x in value]
14196
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
524 else:
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
525 return value.value
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
526 else:
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
527 return default
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
528
19744
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
529 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
530 """ Return the first value received."""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
531 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
532 value = self[key]
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
533 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
534 return value[0].value
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
535 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
536 return value.value
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
537 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
538 return default
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
539
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
540 def getlist(self, key):
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
541 """ Return list of received values."""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
542 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
543 value = self[key]
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
544 if type(value) is type([]):
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41760
diff changeset
545 return [x.value for x in value]
19744
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
546 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
547 return [value.value]
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
548 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
549 return []
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
550
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
551 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
552 """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
553 if self.list is None:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
554 raise TypeError("not indexable")
43418
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
555 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
556
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
557 def __contains__(self, key):
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
558 """Dictionary style __contains__ method."""
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
559 if self.list is None:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
560 raise TypeError("not indexable")
43418
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
561 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
562
4931
18023e7c3862 Add __len__ method
Guido van Rossum <guido@python.org>
parents: 4573
diff changeset
563 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
564 """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
565 return len(self.keys())
4931
18023e7c3862 Add __len__ method
Guido van Rossum <guido@python.org>
parents: 4573
diff changeset
566
43418
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
567 def __nonzero__(self):
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
568 return bool(self.list)
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
569
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
570 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
571 """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
572 qs = self.fp.read(self.length)
48410
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
573 if self.qs_on_post:
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
574 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
575 self.list = list = []
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
576 for key, value in urllib.parse.parse_qsl(qs, self.keep_blank_values,
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
577 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
578 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
579 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
580
9615
c03787ec9811 In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents: 9410
diff changeset
581 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
582
9410
620e02250c80 Patch by Jim Fulton, who writes:
Guido van Rossum <guido@python.org>
parents: 8548
diff changeset
583 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
584 """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
585 ib = self.innerboundary
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
586 if not valid_boundary(ib):
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
587 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
588 self.list = []
48410
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
589 if self.qs_on_post:
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
590 for key, value in urllib.parse.parse_qsl(self.qs_on_post,
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
591 self.keep_blank_values, self.strict_parsing):
48410
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
592 self.list.append(MiniFieldStorage(key, value))
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
593 FieldStorageClass = None
81fd8a8baa9a Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48334
diff changeset
594
9615
c03787ec9811 In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents: 9410
diff changeset
595 klass = self.FieldStorageClass or self.__class__
47632
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
596 parser = email.parser.FeedParser()
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
597 # Create bogus content-type header for proper multipart parsing
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
598 parser.feed('Content-Type: %s; boundary=%s\r\n\r\n' % (self.type, ib))
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
599 parser.feed(self.fp.read())
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
600 full_msg = parser.close()
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
601 # Get subparts
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
602 msgs = full_msg.get_payload()
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
603 for msg in msgs:
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
604 fp = StringIO(msg.get_payload())
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
605 part = klass(fp, msg, ib, environ, keep_blank_values,
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
606 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 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
608 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
609
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
610 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
611 """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
612 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
613 self.read_binary()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
614 self.skip_lines()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
615 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
616 self.read_lines()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
617 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
618
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
619 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
620
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
621 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
622 """Internal: read binary data."""
42930
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
623 self.file = self.make_file()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
624 todo = self.length
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
625 if todo >= 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
626 while todo > 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
627 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
628 if not data:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
629 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
630 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
631 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
632 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
633
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
634 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
635 """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
636 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
637 if self.outerboundary:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
638 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
639 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
640 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
641
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
642 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
643 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
644 if self.__file.tell() + len(line) > 1000:
42930
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
645 self.file = self.make_file()
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
646 data = self.__file.getvalue()
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
647 self.file.write(data)
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
648 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
649 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
650
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
651 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
652 """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
653 while 1:
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
654 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
655 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
656 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
657 break
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
658 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
659
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
660 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
661 """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
662 next = "--" + self.outerboundary
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
663 last = next + "--"
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
664 delim = ""
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
665 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
666 while 1:
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
667 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
668 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
669 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
670 break
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
671 if line[:2] == "--" and last_line_lfend:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
672 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
673 if strippedline == next:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
674 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
675 if strippedline == last:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
676 self.done = 1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
677 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
678 odelim = delim
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
679 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
680 delim = "\r\n"
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
681 line = line[:-2]
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
682 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
683 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
684 delim = "\n"
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
685 line = line[:-1]
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
686 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
687 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
688 delim = ""
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
689 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
690 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
691
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
692 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
693 """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
694 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
695 return
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
696 next = "--" + self.outerboundary
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
697 last = next + "--"
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
698 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
699 while 1:
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
700 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
701 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
702 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
703 break
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
704 if line[:2] == "--" and last_line_lfend:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
705 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
706 if strippedline == next:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
707 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
708 if strippedline == last:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
709 self.done = 1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
710 break
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
711 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
712
42930
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
713 def make_file(self):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
714 """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
715
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
716 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
717 - 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
718 - seek(0)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
719 - 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
720
42930
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
721 The file is always opened in text mode.
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
722
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
723 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
724 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
725 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
726 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
727 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
728
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
729 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
730 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
731 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
732 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
733 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
734
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
735 """
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
736 import tempfile
42932
aa3950f111d9 My wish for TempFile is fulfilled.
Guido van Rossum <guido@python.org>
parents: 42930
diff changeset
737 return tempfile.TemporaryFile("w+", encoding="utf-8", newline="\n")
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
738
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
739
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
740 # Test/debug code
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
741 # ===============
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
742
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
743 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
744 """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
745
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
746 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
747 the script in HTML form.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
748
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
749 """
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
750 print("Content-type: text/html")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
751 print()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
752 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
753 try:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
754 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
755 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
756 print_arguments()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
757 print_form(form)
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
758 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
759 print_environ_usage()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
760 def f():
39782
c94f37054f19 Patch #1550800: make exec a function.
Georg Brandl <georg@python.org>
parents: 39610
diff changeset
761 exec("testing print_exception() -- <I>italics?</I>")
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
762 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
763 f()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
764 print("<H3>What follows is a test, not an actual exception:</H3>")
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
765 g()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
766 except:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
767 print_exception()
4072
f66562536f11 Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents: 3958
diff changeset
768
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
769 print("<H1>Second try with a small maxlen...</H1>")
14645
2d30c35feebe Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents: 14606
diff changeset
770
5499
b905372edd4f Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents: 5302
diff changeset
771 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
772 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
773 try:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
774 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
775 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
776 print_arguments()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
777 print_form(form)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
778 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
779 except:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
780 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
781
4072
f66562536f11 Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents: 3958
diff changeset
782 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
783 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
784 type, value, tb = sys.exc_info()
4072
f66562536f11 Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents: 3958
diff changeset
785 import traceback
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
786 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
787 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
788 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
789 traceback.format_exception_only(type, value)
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
790 print("<PRE>%s<B>%s</B></PRE>" % (
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
791 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
792 escape(list[-1]),
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
793 ))
6347
2656d1eea792 Use sys.exc_info() where needed.
Guido van Rossum <guido@python.org>
parents: 5988
diff changeset
794 del tb
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
795
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
796 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
797 """Dump the shell environment as HTML."""
42930
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
798 keys = sorted(environ.keys())
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
799 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
800 print("<H3>Shell Environment:</H3>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
801 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
802 for key in keys:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
803 print("<DT>", escape(key), "<DD>", escape(environ[key]))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
804 print("</DL>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
805 print()
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
806
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
807 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
808 """Dump the contents of a form as HTML."""
42930
cbd50ece3b61 Make test_cgi pass. I changed the internal file created by make_file()
Guido van Rossum <guido@python.org>
parents: 42142
diff changeset
809 keys = sorted(form.keys())
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
810 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
811 print("<H3>Form Contents:</H3>")
14645
2d30c35feebe Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents: 14606
diff changeset
812 if not keys:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
813 print("<P>No form fields.")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
814 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
815 for key in keys:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
816 print("<DT>" + escape(key) + ":", end=' ')
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
817 value = form[key]
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
818 print("<i>" + escape(repr(type(value))) + "</i>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
819 print("<DD>" + escape(repr(value)))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
820 print("</DL>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
821 print()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
822
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
823 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
824 """Dump the current directory as HTML."""
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
825 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
826 print("<H3>Current Working Directory:</H3>")
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
827 try:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
828 pwd = os.getcwd()
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
829 except os.error as msg:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
830 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
831 else:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
832 print(escape(pwd))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
833 print()
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
834
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
835 def print_arguments():
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
836 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
837 print("<H3>Command Line Arguments:</H3>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
838 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
839 print(sys.argv)
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
840 print()
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
841
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 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
843 """Dump a list of environment variables used by CGI as HTML."""
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
844 print("""
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
845 <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
846 <UL>
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 <LI>AUTH_TYPE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 <LI>CONTENT_LENGTH
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 <LI>CONTENT_TYPE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 <LI>DATE_GMT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 <LI>DATE_LOCAL
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
852 <LI>DOCUMENT_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 <LI>DOCUMENT_ROOT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 <LI>DOCUMENT_URI
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
855 <LI>GATEWAY_INTERFACE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
856 <LI>LAST_MODIFIED
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
857 <LI>PATH
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 <LI>PATH_INFO
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
859 <LI>PATH_TRANSLATED
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
860 <LI>QUERY_STRING
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 <LI>REMOTE_ADDR
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 <LI>REMOTE_HOST
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
863 <LI>REMOTE_IDENT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 <LI>REMOTE_USER
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
865 <LI>REQUEST_METHOD
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
866 <LI>SCRIPT_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 <LI>SERVER_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 <LI>SERVER_PORT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 <LI>SERVER_PROTOCOL
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
870 <LI>SERVER_ROOT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
871 <LI>SERVER_SOFTWARE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
872 </UL>
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
873 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
874 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
875 <UL>
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
876 <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
877 <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
878 <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
879 <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
880 <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
881 <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
882 </UL>
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
883 """)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
884
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
885
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
886 # Utilities
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
887 # =========
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
888
5870
fe4f1eb14d53 Add optional 'quote' flag argument to escape(); if true, translate '"'
Guido van Rossum <guido@python.org>
parents: 5654
diff changeset
889 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
890 '''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
891 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
892 is also translated.'''
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
893 s = s.replace("&", "&amp;") # Must be done first!
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
894 s = s.replace("<", "&lt;")
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
895 s = s.replace(">", "&gt;")
5870
fe4f1eb14d53 Add optional 'quote' flag argument to escape(); if true, translate '"'
Guido van Rossum <guido@python.org>
parents: 5654
diff changeset
896 if quote:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
897 s = s.replace('"', "&quot;")
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
898 return s
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
899
18833
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
900 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
901 import re
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
902 return re.match(_vb_pattern, s)
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
903
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
904 # Invoke mainline
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
905 # ===============
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
906
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
907 # 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
908 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
909 test()