annotate Lib/cgi.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents b9d3e99ea516
children
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
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
34 from io import StringIO, BytesIO, TextIOWrapper
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
35 import sys
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
36 import os
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47643
diff changeset
37 import urllib.parse
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
38 from email.parser import FeedParser
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
39 from warnings import warn
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
40 import html
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
41 import locale
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
42 import tempfile
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
43
46915
e94574455d9d Remove old backwards-compatibility classes from the cgi module.
Georg Brandl <georg@python.org>
parents: 45156
diff changeset
44 __all__ = ["MiniFieldStorage", "FieldStorage",
17074
8323b098c6ce Add a whole lot of stuff to __all__.
Guido van Rossum <guido@python.org>
parents: 16821
diff changeset
45 "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
46 "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
47 "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
48 "print_environ_usage", "escape"]
4214
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 # Logging support
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
51 # ===============
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
52
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
53 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
54 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
55
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
56 def initlog(*allargs):
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
57 """Write a log message, if there is a log file.
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
58
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
59 Even though this function is called initlog(), you should always
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
60 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
61 (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
62 nolog (when logging is disabled).
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
63
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
64 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
65 any) are arguments to the % operator, so e.g.
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
66 log("%s: %s", "a", "b")
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
67 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
68
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
69 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
70 which log data is written.
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
71
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
72 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
73 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
74 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
75 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
76 send an error message).
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
77
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
78 """
71337
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
79 global log, logfile, logfp
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
80 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
81 try:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
82 logfp = open(logfile, "a")
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81017
diff changeset
83 except OSError:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
84 pass
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
85 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
86 log = nolog
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
87 else:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
88 log = dolog
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 25214
diff changeset
89 log(*allargs)
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
90
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
91 def dolog(fmt, *args):
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
92 """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
93 logfp.write(fmt%args + "\n")
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
94
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
95 def nolog(*allargs):
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
96 """Dummy function, assigned to log when logging is disabled."""
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
97 pass
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
98
71337
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
99 def closelog():
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
100 """Close the log file."""
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
101 global log, logfile, logfp
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
102 logfile = ''
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
103 if logfp:
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
104 logfp.close()
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
105 logfp = None
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
106 log = initlog
66e519792e4c Add cgi.closelog() function to close the log file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
107
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
108 log = initlog # The current logging function
4214
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
109
688d566cb15b Added logging support.
Guido van Rossum <guido@python.org>
parents: 4213
diff changeset
110
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
111 # Parsing functions
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
112 # =================
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
113
5499
b905372edd4f Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents: 5302
diff changeset
114 # 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
115 # 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
116 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
117
4534
d90d7b541ada Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents: 4486
diff changeset
118 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
119 """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
120
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
121 Arguments, all optional:
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
122
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
123 fp : file pointer; default: sys.stdin.buffer
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
124
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
125 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
126
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
127 keep_blank_values: flag indicating whether blank values in
63886
50f8f5247c81 Merged revisions 83901 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents: 53909
diff changeset
128 percent-encoded forms should be treated as blank strings.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
129 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
130 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
131 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
132 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
133
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
134 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
135 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
136 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
137 """
23609
456d58451fee Use is None rather than general boolean
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
138 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
139 fp = sys.stdin
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
140
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
141 # field keys and values (except for files) are returned as strings
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
142 # an encoding is required to decode the bytes read from self.fp
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
143 if hasattr(fp,'encoding'):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
144 encoding = fp.encoding
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
145 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
146 encoding = 'latin-1'
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
147
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
148 # fp.read() must return bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
149 if isinstance(fp, TextIOWrapper):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
150 fp = fp.buffer
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
151
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
152 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
153 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
154 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
155 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
156 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
157 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
158 elif ctype == 'application/x-www-form-urlencoded':
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
159 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
160 if maxlen and clength > maxlen:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
161 raise ValueError('Maximum content length exceeded')
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
162 qs = fp.read(clength).decode(encoding)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
163 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
164 qs = '' # Unknown content-type
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
165 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
166 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
167 qs = qs + environ['QUERY_STRING']
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
168 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
169 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
170 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
171 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
172 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
173 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
174 else:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
175 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
176 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
177 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
178 qs = ""
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
179 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
180 return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
181 encoding=encoding)
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
182
2918
cfa9b3a84872 added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents: 2538
diff changeset
183
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
184 # 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
185 # 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
186
4534
d90d7b541ada Added 'strict_parsing' option to all parsing functions. This causes a
Guido van Rossum <guido@python.org>
parents: 4486
diff changeset
187 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
188 """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
189 warn("cgi.parse_qs is deprecated, use urllib.parse.parse_qs instead",
53909
238502460795 #4351: more appropriate DeprecationWarning stacklevels
Philip Jenvey <pjenvey@underboss.org>
parents: 49976
diff changeset
190 DeprecationWarning, 2)
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
191 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
192
3faa63430924 Patch by Jim Fulton: new function parse_qsl(), which is like
Guido van Rossum <guido@python.org>
parents: 10914
diff changeset
193 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
194 """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
195 warn("cgi.parse_qsl is deprecated, use urllib.parse.parse_qsl instead",
53909
238502460795 #4351: more appropriate DeprecationWarning stacklevels
Philip Jenvey <pjenvey@underboss.org>
parents: 49976
diff changeset
196 DeprecationWarning, 2)
48998
65e23683c010 Issue 600362: Relocated parse_qs() and parse_qsl(), from the cgi module
Facundo Batista <facundobatista@gmail.com>
parents: 48410
diff changeset
197 return urllib.parse.parse_qsl(qs, keep_blank_values, strict_parsing)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
198
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
199 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
200 """Parse multipart input.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
201
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
202 Arguments:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
203 fp : input file
34367
5cd4fffaf910 Patch #1079734: remove dependencies on (deprecated) rfc822 and mimetools
Johannes Gijsbers <jlg@dds.nl>
parents: 34294
diff changeset
204 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
205
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
206 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
207 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
208 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
209 use the FieldStorage class instead which is much more flexible. Note
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
210 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
211 header.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
212
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
213 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
214 that.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
215
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
216 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
217 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
218 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
219 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
220 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
221 since it can call parse_multipart().
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
222
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
223 """
47635
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47632
diff changeset
224 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
225
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
226 boundary = b""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
227 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
228 boundary = pdict['boundary']
18833
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
229 if not valid_boundary(boundary):
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
230 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
231 % (boundary,))
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18833
diff changeset
232
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
233 nextpart = b"--" + boundary
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
234 lastpart = b"--" + boundary + b"--"
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
235 partdict = {}
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
236 terminator = b""
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
237
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
238 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
239 bytes = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
240 data = None
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
241 if terminator:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
242 # 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
243 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
244 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
245 if clength:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
246 try:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
247 bytes = int(clength)
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
248 except ValueError:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
249 pass
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
250 if bytes > 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
251 if maxlen and bytes > maxlen:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
252 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
253 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
254 else:
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
255 data = b""
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
256 # 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
257 lines = []
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
258 while 1:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
259 line = fp.readline()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
260 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
261 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
262 break
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
263 if line.startswith(b"--"):
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
264 terminator = line.rstrip()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
265 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
266 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
267 lines.append(line)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
268 # Done with part.
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
269 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
270 continue
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
271 if bytes < 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
272 if lines:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
273 # 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
274 line = lines[-1]
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
275 if line[-2:] == b"\r\n":
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
276 line = line[:-2]
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
277 elif line[-1:] == b"\n":
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
278 line = line[:-1]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
279 lines[-1] = line
81674
a46a0dafcb7a Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries and
Senthil Kumaran <senthil@uthcode.com>
parents: 72989
diff changeset
280 data = b"".join(lines)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
281 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
282 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
283 continue
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
284 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
285 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
286 continue
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
287 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
288 name = params['name']
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
289 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
290 continue
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
291 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
292 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
293 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
294 partdict[name] = [data]
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
295
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
296 return partdict
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
297
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
298
49976
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
299 def _parseparam(s):
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
300 while s[:1] == ';':
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
301 s = s[1:]
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
302 end = s.find(';')
72989
f5bd78b11275 3.2 - Fix closes Issue12529 - cgi.parse_header failure on double quotes and
Senthil Kumaran <senthil@uthcode.com>
parents: 68257
diff changeset
303 while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2:
49976
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
304 end = s.find(';', end + 1)
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
305 if end < 0:
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
306 end = len(s)
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
307 f = s[:end]
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
308 yield f.strip()
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
309 s = s[end:]
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
310
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
311 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
312 """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
313
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
314 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
315
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
316 """
49976
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
317 parts = _parseparam(';' + line)
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
318 key = parts.__next__()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
319 pdict = {}
49976
89e738c792c0 Merged revisions 67534 via svnmerge from
Fred Drake <fdrake@acm.org>
parents: 49101
diff changeset
320 for p in parts:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
321 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
322 if i >= 0:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
323 name = p[:i].strip().lower()
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
324 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
325 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
326 value = value[1:-1]
33131
846ba2972d7c Let cgi.parse_header() properly unquote headers (patch #1008597).
Johannes Gijsbers <jlg@dds.nl>
parents: 32758
diff changeset
327 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
328 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
329 return key, pdict
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
330
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
331
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
332 # Classes for field storage
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
333 # =========================
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
334
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
335 class MiniFieldStorage:
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
336
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
337 """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
338
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
339 # Dummy attributes
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
340 filename = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
341 list = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
342 type = None
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
343 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
344 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
345 disposition = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
346 disposition_options = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
347 headers = {}
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
348
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
349 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
350 """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
351 self.name = name
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
352 self.value = value
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
353 # self.file = StringIO(value)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
354
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
355 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
356 """Return printable representation."""
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
357 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
358
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
359
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
360 class FieldStorage:
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
361
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
362 """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
363
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
364 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
365 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
366 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
367 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
368 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
369 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
370
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
371 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
372
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
373 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
374 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
375 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
376
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
377 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
378 transparently reads the file every time you request the value
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
379 and returns *bytes*
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
380
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
381 file: the file(-like) object from which you can read the data *as
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
382 bytes* ; 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
383
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
384 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
385
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
386 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
387 line
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
388
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
389 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
390
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
391 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
392
47632
18eaa1d5f394 Patch by Humberto Diogenes for issue 2849, removing rfc822 module from
Barry Warsaw <barry@python.org>
parents: 46915
diff changeset
393 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
394 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
395
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
396 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
397 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
398 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
399 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
400 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
401
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
402 """
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
403 def __init__(self, fp=None, headers=None, outerboundary=b'',
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
404 environ=os.environ, keep_blank_values=0, strict_parsing=0,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
405 limit=None, encoding='utf-8', errors='replace'):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
406 """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
407
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
408 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
409
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
410 fp : file pointer; default: sys.stdin.buffer
8284
f834e197bd14 Make Tim O'Malley's requested change: in FieldStorage.__init__(), when
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
411 (not used when the request method is GET)
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
412 Can be :
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
413 1. a TextIOWrapper object
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
414 2. an object whose read() and readline() methods return bytes
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
415
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
416 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
417 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
418
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
419 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
420 (for internal use only)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
421
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
422 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
423
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
424 keep_blank_values: flag indicating whether blank values in
63886
50f8f5247c81 Merged revisions 83901 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents: 53909
diff changeset
425 percent-encoded forms should be treated as blank strings.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
426 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
427 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
428 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
429 not included.
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
430
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
431 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
432 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
433 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
434
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
435 limit : used internally to read parts of multipart/form-data forms,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
436 to exit from the reading loop when reached. It is the difference
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
437 between the form content-length and the number of bytes already
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
438 read
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
439
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
440 encoding, errors : the encoding and error handler used to decode the
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
441 binary stream to strings. Must be the same as the charset defined
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
442 for the page sending the form (content-type : meta http-equiv or
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
443 header)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
444
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
445 """
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
446 method = 'GET'
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
447 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
448 self.strict_parsing = strict_parsing
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
449 if 'REQUEST_METHOD' in environ:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
450 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
451 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
452 if method == 'GET' or method == 'HEAD':
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
453 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
454 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
455 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
456 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
457 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
458 qs = ""
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
459 qs = qs.encode(locale.getpreferredencoding(), 'surrogateescape')
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
460 fp = BytesIO(qs)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
461 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
462 headers = {'content-type':
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
463 "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
464 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
465 headers = {}
7f94b4958056 Be more careful than the previous patch. The default content-type
Guido van Rossum <guido@python.org>
parents: 8477
diff changeset
466 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
467 # 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
468 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
469 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
470 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
471 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
472 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
473 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
474 headers['content-length'] = environ['CONTENT_LENGTH']
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
475 if fp is None:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
476 self.fp = sys.stdin.buffer
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
477 # self.fp.read() must return bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
478 elif isinstance(fp, TextIOWrapper):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
479 self.fp = fp.buffer
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
480 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
481 self.fp = fp
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
482
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
483 self.encoding = encoding
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
484 self.errors = errors
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
485
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
486 self.headers = headers
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
487 if not isinstance(outerboundary, bytes):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
488 raise TypeError('outerboundary must be bytes, not %s'
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
489 % type(outerboundary).__name__)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
490 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
491
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
492 self.bytes_read = 0
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
493 self.limit = limit
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
494
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
495 # 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
496 cdisp, pdict = "", {}
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
497 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
498 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
499 self.disposition = cdisp
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
500 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
501 self.name = None
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
502 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
503 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
504 self.filename = None
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
505 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
506 self.filename = pdict['filename']
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
507 self._binary_file = self.filename is not None
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
508
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
509 # 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
510 #
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
511 # 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
512 # 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
513 # 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
514 # 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
515 # 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
516 # 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
517 # header.
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
518 #
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
519 # 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
520 # 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
521 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
522 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
523 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
524 ctype, pdict = "text/plain", {}
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
525 else:
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
526 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
527 self.type = ctype
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
528 self.type_options = pdict
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
529 if 'boundary' in pdict:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
530 self.innerboundary = pdict['boundary'].encode(self.encoding)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
531 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
532 self.innerboundary = b""
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
533
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
534 clen = -1
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
535 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
536 try:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
537 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
538 except ValueError:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
539 pass
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
540 if maxlen and clen > maxlen:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
541 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
542 self.length = clen
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
543 if self.limit is None and clen:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
544 self.limit = clen
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
545
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
546 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
547 self.done = 0
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
548 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
549 self.read_urlencoded()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
550 elif ctype[:10] == 'multipart/':
9410
620e02250c80 Patch by Jim Fulton, who writes:
Guido van Rossum <guido@python.org>
parents: 8548
diff changeset
551 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
552 else:
9821
28d3a9fcb577 FieldStorage.__init__(): if there is no content-type header, use
Barry Warsaw <barry@python.org>
parents: 9615
diff changeset
553 self.read_single()
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
554
85348
c0e9ba7b26d5 Issue #18394: Explicitly close the file object cgi.FieldStorage
Brett Cannon <brett@python.org>
parents: 84483
diff changeset
555 def __del__(self):
c0e9ba7b26d5 Issue #18394: Explicitly close the file object cgi.FieldStorage
Brett Cannon <brett@python.org>
parents: 84483
diff changeset
556 try:
c0e9ba7b26d5 Issue #18394: Explicitly close the file object cgi.FieldStorage
Brett Cannon <brett@python.org>
parents: 84483
diff changeset
557 self.file.close()
c0e9ba7b26d5 Issue #18394: Explicitly close the file object cgi.FieldStorage
Brett Cannon <brett@python.org>
parents: 84483
diff changeset
558 except AttributeError:
c0e9ba7b26d5 Issue #18394: Explicitly close the file object cgi.FieldStorage
Brett Cannon <brett@python.org>
parents: 84483
diff changeset
559 pass
c0e9ba7b26d5 Issue #18394: Explicitly close the file object cgi.FieldStorage
Brett Cannon <brett@python.org>
parents: 84483
diff changeset
560
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
561 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
562 """Return a printable representation."""
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
563 return "FieldStorage(%r, %r, %r)" % (
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 28089
diff changeset
564 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
565
25214
5330c0620810 Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents: 24058
diff changeset
566 def __iter__(self):
5330c0620810 Patch suggested by Hamish Lawson: add an __iter__() that returns
Guido van Rossum <guido@python.org>
parents: 24058
diff changeset
567 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
568
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
569 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
570 if name != 'value':
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
571 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
572 if self.file:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
573 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
574 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
575 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
576 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
577 value = self.list
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
578 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
579 value = None
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
580 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
581
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
582 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
583 """Dictionary style indexing."""
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
584 if self.list is None:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
585 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
586 found = []
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
587 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
588 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
589 if not found:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
590 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
591 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
592 return found[0]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
593 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
594 return found
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
595
14196
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
596 def getvalue(self, key, default=None):
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
597 """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
598 if key in self:
14196
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
599 value = self[key]
67591
96ffe4a311dd cgi: use isinstance(x, list) instead of type(x) == type([])
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67590
diff changeset
600 if isinstance(value, list):
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41760
diff changeset
601 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
602 else:
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
603 return value.value
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
604 else:
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
605 return default
41234ae95d2a Closing patch #101120 -- After everyone agreed.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13840
diff changeset
606
19744
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
607 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
608 """ Return the first value received."""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
609 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
610 value = self[key]
67591
96ffe4a311dd cgi: use isinstance(x, list) instead of type(x) == type([])
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67590
diff changeset
611 if isinstance(value, list):
19744
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
612 return value[0].value
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
613 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
614 return value.value
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
615 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
616 return default
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
617
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
618 def getlist(self, key):
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
619 """ Return list of received values."""
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
620 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
621 value = self[key]
67591
96ffe4a311dd cgi: use isinstance(x, list) instead of type(x) == type([])
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67590
diff changeset
622 if isinstance(value, list):
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41760
diff changeset
623 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
624 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
625 return [value.value]
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
626 else:
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
627 return []
f1430e3382bb Class FieldStorage: add two new methods, getfirst() and getlist(),
Guido van Rossum <guido@python.org>
parents: 19119
diff changeset
628
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
629 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
630 """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
631 if self.list is None:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
632 raise TypeError("not indexable")
43418
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
633 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
634
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
635 def __contains__(self, key):
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
636 """Dictionary style __contains__ method."""
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23609
diff changeset
637 if self.list is None:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
638 raise TypeError("not indexable")
43418
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
639 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
640
4931
18023e7c3862 Add __len__ method
Guido van Rossum <guido@python.org>
parents: 4573
diff changeset
641 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
642 """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
643 return len(self.keys())
4931
18023e7c3862 Add __len__ method
Guido van Rossum <guido@python.org>
parents: 4573
diff changeset
644
43418
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
645 def __nonzero__(self):
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
646 return bool(self.list)
0c8fec76111c Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43020
diff changeset
647
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
648 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
649 """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
650 qs = self.fp.read(self.length)
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
651 if not isinstance(qs, bytes):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
652 raise ValueError("%s should return bytes, got %s" \
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
653 % (self.fp, type(qs).__name__))
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
654 qs = qs.decode(self.encoding, self.errors)
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
655 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
656 qs += '&' + self.qs_on_post
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
657 self.list = []
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
658 query = urllib.parse.parse_qsl(
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
659 qs, self.keep_blank_values, self.strict_parsing,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
660 encoding=self.encoding, errors=self.errors)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
661 for key, value in query:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
662 self.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
663 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
664
9615
c03787ec9811 In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents: 9410
diff changeset
665 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
666
9410
620e02250c80 Patch by Jim Fulton, who writes:
Guido van Rossum <guido@python.org>
parents: 8548
diff changeset
667 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
668 """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
669 ib = self.innerboundary
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
670 if not valid_boundary(ib):
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42932
diff changeset
671 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
672 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
673 if self.qs_on_post:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
674 query = urllib.parse.parse_qsl(
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
675 self.qs_on_post, self.keep_blank_values, self.strict_parsing,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
676 encoding=self.encoding, errors=self.errors)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
677 for key, value in query:
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
678 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
679
9615
c03787ec9811 In read_multi, allow a subclass to override the class we instantiate
Guido van Rossum <guido@python.org>
parents: 9410
diff changeset
680 klass = self.FieldStorageClass or self.__class__
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
681 first_line = self.fp.readline() # bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
682 if not isinstance(first_line, bytes):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
683 raise ValueError("%s should return bytes, got %s" \
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
684 % (self.fp, type(first_line).__name__))
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
685 self.bytes_read += len(first_line)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
686 # first line holds boundary ; ignore it, or check that
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
687 # b"--" + ib == first_line.strip() ?
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
688 while True:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
689 parser = FeedParser()
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
690 hdr_text = b""
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
691 while True:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
692 data = self.fp.readline()
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
693 hdr_text += data
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
694 if not data.strip():
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
695 break
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
696 if not hdr_text:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
697 break
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
698 # parser takes strings, not bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
699 self.bytes_read += len(hdr_text)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
700 parser.feed(hdr_text.decode(self.encoding, self.errors))
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
701 headers = parser.close()
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
702 part = klass(self.fp, headers, ib, environ, keep_blank_values,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
703 strict_parsing,self.limit-self.bytes_read,
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
704 self.encoding, self.errors)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
705 self.bytes_read += part.bytes_read
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
706 self.list.append(part)
84482
406ce103c170 Issue #18013: Fix cgi.FieldStorage to parse the W3C sample form.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 84182
diff changeset
707 if part.done or self.bytes_read >= self.length > 0:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
708 break
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
709 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
710
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
711 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
712 """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
713 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
714 self.read_binary()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
715 self.skip_lines()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
716 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
717 self.read_lines()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
718 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
719
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
720 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
721
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
722 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
723 """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
724 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
725 todo = self.length
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
726 if todo >= 0:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
727 while todo > 0:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
728 data = self.fp.read(min(todo, self.bufsize)) # bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
729 if not isinstance(data, bytes):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
730 raise ValueError("%s should return bytes, got %s"
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
731 % (self.fp, type(data).__name__))
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
732 self.bytes_read += len(data)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
733 if not data:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
734 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
735 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
736 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
737 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
738
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
739 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
740 """Internal: read lines until EOF or outerboundary."""
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
741 if self._binary_file:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
742 self.file = self.__file = BytesIO() # store data as bytes for files
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
743 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
744 self.file = self.__file = StringIO() # as strings for other fields
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
745 if self.outerboundary:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
746 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
747 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
748 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
749
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
750 def __write(self, line):
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
751 """line is always bytes, not string"""
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
752 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
753 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
754 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
755 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
756 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
757 self.__file = None
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
758 if self._binary_file:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
759 # keep bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
760 self.file.write(line)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
761 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
762 # decode to string
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
763 self.file.write(line.decode(self.encoding, self.errors))
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
764
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
765 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
766 """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
767 while 1:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
768 line = self.fp.readline(1<<16) # bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
769 self.bytes_read += len(line)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
770 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
771 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
772 break
18337
c2a60de91d2c Solve SF bug #231249: cgi.py opens too many (temporary) files.
Guido van Rossum <guido@python.org>
parents: 17074
diff changeset
773 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
774
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
775 def read_lines_to_outerboundary(self):
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
776 """Internal: read lines until outerboundary.
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
777 Data is read as bytes: boundaries and line ends must be converted
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
778 to bytes for comparisons.
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
779 """
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
780 next_boundary = b"--" + self.outerboundary
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
781 last_boundary = next_boundary + b"--"
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
782 delim = b""
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
783 last_line_lfend = True
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
784 _read = 0
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
785 while 1:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
786 if _read >= self.limit:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
787 break
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
788 line = self.fp.readline(1<<16) # bytes
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
789 self.bytes_read += len(line)
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
790 _read += len(line)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
791 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
792 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
793 break
84182
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
794 if delim == b"\r":
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
795 line = delim + line
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
796 delim = b""
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
797 if line.startswith(b"--") and last_line_lfend:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
798 strippedline = line.rstrip()
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
799 if strippedline == next_boundary:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
800 break
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
801 if strippedline == last_boundary:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
802 self.done = 1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
803 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
804 odelim = delim
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
805 if line.endswith(b"\r\n"):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
806 delim = b"\r\n"
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
807 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
808 last_line_lfend = True
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
809 elif line.endswith(b"\n"):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
810 delim = b"\n"
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
811 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
812 last_line_lfend = True
84182
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
813 elif line.endswith(b"\r"):
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
814 # We may interrupt \r\n sequences if they span the 2**16
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
815 # byte boundary
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
816 delim = b"\r"
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
817 line = line[:-1]
a48f65bac986 Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
Serhiy Storchaka <storchaka@gmail.com>
parents: 81675
diff changeset
818 last_line_lfend = False
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
819 else:
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
820 delim = b""
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
821 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
822 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
823
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
824 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
825 """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
826 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
827 return
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
828 next_boundary = b"--" + self.outerboundary
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
829 last_boundary = next_boundary + b"--"
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
830 last_line_lfend = True
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
831 while True:
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
832 line = self.fp.readline(1<<16)
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
833 self.bytes_read += len(line)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
834 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
835 self.done = -1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
836 break
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
837 if line.endswith(b"--") and last_line_lfend:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
838 strippedline = line.strip()
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
839 if strippedline == next_boundary:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
840 break
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
841 if strippedline == last_boundary:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
842 self.done = 1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
843 break
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
844 last_line_lfend = line.endswith(b'\n')
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
845
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
846 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
847 """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
848
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
849 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
850 - 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
851 - seek(0)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
852 - 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
853
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
854 The file is opened in binary mode for files, in text mode
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
855 for other fields
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
856
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
857 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
858 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
859 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
860 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
861 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
862
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
863 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
864 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
865 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
866 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
867 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
868
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
869 """
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
870 if self._binary_file:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
871 return tempfile.TemporaryFile("wb+")
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
872 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
873 return tempfile.TemporaryFile("w+",
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
874 encoding=self.encoding, newline = '\n')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15669
diff changeset
875
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
876
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
877 # Test/debug code
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
878 # ===============
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
879
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
880 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
881 """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
882
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
883 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
884 the script in HTML form.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
885
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
886 """
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
887 print("Content-type: text/html")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
888 print()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
889 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
890 try:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
891 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
892 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
893 print_arguments()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
894 print_form(form)
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
895 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
896 print_environ_usage()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
897 def f():
39782
c94f37054f19 Patch #1550800: make exec a function.
Georg Brandl <georg@python.org>
parents: 39610
diff changeset
898 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
899 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
900 f()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
901 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
902 g()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
903 except:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
904 print_exception()
4072
f66562536f11 Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents: 3958
diff changeset
905
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
906 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
907
5499
b905372edd4f Untested changes by Skip Montanaro to have an optional limit on the
Guido van Rossum <guido@python.org>
parents: 5302
diff changeset
908 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
909 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
910 try:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
911 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
912 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
913 print_arguments()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
914 print_form(form)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
915 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
916 except:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
917 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
918
4072
f66562536f11 Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents: 3958
diff changeset
919 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
920 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
921 type, value, tb = sys.exc_info()
4072
f66562536f11 Added print_exception() convenience function.
Guido van Rossum <guido@python.org>
parents: 3958
diff changeset
922 import traceback
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
923 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
924 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
925 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
926 traceback.format_exception_only(type, value)
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
927 print("<PRE>%s<B>%s</B></PRE>" % (
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
928 html.escape("".join(list[:-1])),
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
929 html.escape(list[-1]),
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
930 ))
6347
2656d1eea792 Use sys.exc_info() where needed.
Guido van Rossum <guido@python.org>
parents: 5988
diff changeset
931 del tb
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
932
3794
d1c47f4f1541 Changes by Jim Fulton: pass environ around as arg;
Guido van Rossum <guido@python.org>
parents: 3630
diff changeset
933 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
934 """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
935 keys = sorted(environ.keys())
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
936 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
937 print("<H3>Shell Environment:</H3>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
938 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
939 for key in keys:
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
940 print("<DT>", html.escape(key), "<DD>", html.escape(environ[key]))
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
941 print("</DL>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
942 print()
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
943
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
944 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
945 """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
946 keys = sorted(form.keys())
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
947 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
948 print("<H3>Form Contents:</H3>")
14645
2d30c35feebe Improve the test output a bit.
Guido van Rossum <guido@python.org>
parents: 14606
diff changeset
949 if not keys:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
950 print("<P>No form fields.")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
951 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
952 for key in keys:
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
953 print("<DT>" + html.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
954 value = form[key]
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
955 print("<i>" + html.escape(repr(type(value))) + "</i>")
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
956 print("<DD>" + html.escape(repr(value)))
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
957 print("</DL>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
958 print()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
959
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
960 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
961 """Dump the current directory as HTML."""
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
962 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
963 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
964 try:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6941
diff changeset
965 pwd = os.getcwd()
80932
47f98a550d42 Issue #16706: get rid of os.error
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 73914
diff changeset
966 except OSError as msg:
81017
6cfe2982de42 Use OESeeror instead of os.error (#16720)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80932
diff changeset
967 print("OSError:", html.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
968 else:
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
969 print(html.escape(pwd))
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
970 print()
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
971
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
972 def print_arguments():
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
973 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
974 print("<H3>Command Line Arguments:</H3>")
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
975 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
976 print(sys.argv)
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
977 print()
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
978
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
979 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
980 """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
981 print("""
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
982 <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
983 <UL>
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
984 <LI>AUTH_TYPE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 <LI>CONTENT_LENGTH
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
986 <LI>CONTENT_TYPE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
987 <LI>DATE_GMT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
988 <LI>DATE_LOCAL
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
989 <LI>DOCUMENT_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
990 <LI>DOCUMENT_ROOT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
991 <LI>DOCUMENT_URI
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
992 <LI>GATEWAY_INTERFACE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
993 <LI>LAST_MODIFIED
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
994 <LI>PATH
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
995 <LI>PATH_INFO
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
996 <LI>PATH_TRANSLATED
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
997 <LI>QUERY_STRING
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
998 <LI>REMOTE_ADDR
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
999 <LI>REMOTE_HOST
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1000 <LI>REMOTE_IDENT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1001 <LI>REMOTE_USER
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002 <LI>REQUEST_METHOD
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 <LI>SCRIPT_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004 <LI>SERVER_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1005 <LI>SERVER_PORT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1006 <LI>SERVER_PROTOCOL
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1007 <LI>SERVER_ROOT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 <LI>SERVER_SOFTWARE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1009 </UL>
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1010 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
1011 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
1012 <UL>
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1013 <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
1014 <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
1015 <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
1016 <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
1017 <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
1018 <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
1019 </UL>
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
1020 """)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1021
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1022
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1023 # Utilities
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1024 # =========
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025
5870
fe4f1eb14d53 Add optional 'quote' flag argument to escape(); if true, translate '"'
Guido van Rossum <guido@python.org>
parents: 5654
diff changeset
1026 def escape(s, quote=None):
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
1027 """Deprecated API."""
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
1028 warn("cgi.escape is deprecated, use html.escape instead",
73914
f82ebf9b3a52 Issue #13248: turn 3.2's PendingDeprecationWarning into 3.3's DeprecationWarning (cgi, importlib, nntplib, smtpd).
Florent Xicluna <florent.xicluna@gmail.com>
parents: 72990
diff changeset
1029 DeprecationWarning, stacklevel=2)
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
1030 s = s.replace("&", "&amp;") # Must be done first!
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
1031 s = s.replace("<", "&lt;")
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
1032 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
1033 if quote:
16503
8d7655ac8bf8 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
1034 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
1035 return s
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036
65362
5633af590057 #2830: add html.escape() helper and move cgi.escape() uses in the standard library to it. It defaults to quote=True and also escapes single quotes, which makes casual use safer. The cgi.escape() interface is not touched, but emits a (silent) PendingDeprecationWarning.
Georg Brandl <georg@python.org>
parents: 63883
diff changeset
1037
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
1038 def valid_boundary(s, _vb_pattern=None):
18833
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
1039 import re
67590
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
1040 if isinstance(s, bytes):
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
1041 _vb_pattern = b"^[ -~]{0,200}[!-~]$"
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
1042 else:
d864328a74e4 Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65362
diff changeset
1043 _vb_pattern = "^[ -~]{0,200}[!-~]$"
18833
3cc66750687d Fix a denial-of-service attack, SF bug #443120.
Guido van Rossum <guido@python.org>
parents: 18337
diff changeset
1044 return re.match(_vb_pattern, s)
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1045
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1046 # Invoke mainline
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1047 # ===============
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1048
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1049 # 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
1050 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
1051 test()