blob: dd1138940519a98dd99fe7d2c1effb641fbb373f [file] [log] [blame]
Guido van Rossum51914632000-10-03 13:51:09 +00001#! /usr/local/bin/python
Guido van Rossum1c9daa81995-09-18 21:52:37 +00002
Guido van Rossum467d7232001-02-13 13:13:33 +00003# NOTE: the above "/usr/local/bin/python" is NOT a mistake. It is
4# intentionally NOT "/usr/bin/env python". On many systems
5# (e.g. Solaris), /usr/local/bin is not in $PATH as passed to CGI
6# scripts, and /usr/local/bin is the default directory where Python is
7# installed, so /usr/bin/env would be unable to find python. Granted,
8# binary installations by Linux vendors often install Python in
9# /usr/bin. So let those vendors patch cgi.py to match their choice
10# of installation.
11
Guido van Rossum72755611996-03-06 07:20:06 +000012"""Support module for CGI (Common Gateway Interface) scripts.
Guido van Rossum1c9daa81995-09-18 21:52:37 +000013
Guido van Rossum7aee3841996-03-07 18:00:44 +000014This module defines a number of utilities for use by CGI scripts
15written in Python.
Guido van Rossum72755611996-03-06 07:20:06 +000016"""
17
Jeremy Hyltonc253d9a2000-08-03 20:57:44 +000018# XXX Perhaps there should be a slimmed version that doesn't contain
19# all those backwards compatible and debugging classes and functions?
Guido van Rossum98d9fd32000-02-28 15:12:25 +000020
21# History
22# -------
Tim Peters88869f92001-01-14 23:36:06 +000023#
Guido van Rossum98d9fd32000-02-28 15:12:25 +000024# Michael McLay started this module. Steve Majewski changed the
25# interface to SvFormContentDict and FormContentDict. The multipart
26# parsing was inspired by code submitted by Andreas Paepcke. Guido van
27# Rossum rewrote, reformatted and documented the module and is currently
28# responsible for its maintenance.
Tim Peters88869f92001-01-14 23:36:06 +000029#
Guido van Rossum98d9fd32000-02-28 15:12:25 +000030
Guido van Rossum52b8c292001-06-29 13:06:06 +000031__version__ = "2.6"
Guido van Rossum0147db01996-03-09 03:16:04 +000032
Guido van Rossum72755611996-03-06 07:20:06 +000033
34# Imports
35# =======
36
Raymond Hettingerf871d832004-12-31 21:59:02 +000037from operator import attrgetter
Guido van Rossum72755611996-03-06 07:20:06 +000038import sys
39import os
Guido van Rossuma5e9fb61997-08-12 18:18:13 +000040import urllib
Moshe Zadkaa1a4b592000-08-25 21:47:56 +000041import UserDict
Brett Cannon1eaf0742008-09-02 01:25:16 +000042from warnings import filterwarnings, catch_warnings
43with catch_warnings():
44 if sys.py3kwarning:
45 filterwarnings("ignore", ".*mimetools has been removed",
46 DeprecationWarning)
Brett Cannon721b1452008-08-16 22:00:27 +000047 import mimetools
Brett Cannon1eaf0742008-09-02 01:25:16 +000048 if sys.py3kwarning:
49 filterwarnings("ignore", ".*rfc822 has been removed", DeprecationWarning)
Brett Cannon721b1452008-08-16 22:00:27 +000050 import rfc822
51
Raymond Hettingera6172712004-12-31 19:15:26 +000052try:
53 from cStringIO import StringIO
54except ImportError:
55 from StringIO import StringIO
Guido van Rossum72755611996-03-06 07:20:06 +000056
Guido van Rossuma8423a92001-03-19 13:40:44 +000057__all__ = ["MiniFieldStorage", "FieldStorage", "FormContentDict",
58 "SvFormContentDict", "InterpFormContentDict", "FormContent",
59 "parse", "parse_qs", "parse_qsl", "parse_multipart",
60 "parse_header", "print_exception", "print_environ",
61 "print_form", "print_directory", "print_arguments",
62 "print_environ_usage", "escape"]
Guido van Rossumc204c701996-09-05 19:07:11 +000063
64# Logging support
65# ===============
66
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000067logfile = "" # Filename to log to, if not empty
68logfp = None # File object to log to, if not None
Guido van Rossumc204c701996-09-05 19:07:11 +000069
70def initlog(*allargs):
71 """Write a log message, if there is a log file.
72
73 Even though this function is called initlog(), you should always
74 use log(); log is a variable that is set either to initlog
75 (initially), to dolog (once the log file has been opened), or to
76 nolog (when logging is disabled).
77
78 The first argument is a format string; the remaining arguments (if
79 any) are arguments to the % operator, so e.g.
80 log("%s: %s", "a", "b")
81 will write "a: b" to the log file, followed by a newline.
82
83 If the global logfp is not None, it should be a file object to
84 which log data is written.
85
86 If the global logfp is None, the global logfile may be a string
87 giving a filename to open, in append mode. This file should be
88 world writable!!! If the file can't be opened, logging is
89 silently disabled (since there is no safe place where we could
90 send an error message).
91
92 """
93 global logfp, log
94 if logfile and not logfp:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000095 try:
96 logfp = open(logfile, "a")
97 except IOError:
98 pass
Guido van Rossumc204c701996-09-05 19:07:11 +000099 if not logfp:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000100 log = nolog
Guido van Rossumc204c701996-09-05 19:07:11 +0000101 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000102 log = dolog
Guido van Rossum68468eb2003-02-27 20:14:51 +0000103 log(*allargs)
Guido van Rossumc204c701996-09-05 19:07:11 +0000104
105def dolog(fmt, *args):
106 """Write a log message to the log file. See initlog() for docs."""
107 logfp.write(fmt%args + "\n")
108
109def nolog(*allargs):
110 """Dummy function, assigned to log when logging is disabled."""
111 pass
112
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000113log = initlog # The current logging function
Guido van Rossumc204c701996-09-05 19:07:11 +0000114
115
Guido van Rossum72755611996-03-06 07:20:06 +0000116# Parsing functions
117# =================
118
Guido van Rossumad164711997-05-13 19:03:23 +0000119# Maximum input we will accept when REQUEST_METHOD is POST
120# 0 ==> unlimited input
121maxlen = 0
122
Guido van Rossume08c04c1996-11-11 19:29:11 +0000123def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0):
Guido van Rossum773ab271996-07-23 03:46:24 +0000124 """Parse a query in the environment or from a file (default stdin)
125
126 Arguments, all optional:
127
128 fp : file pointer; default: sys.stdin
129
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000130 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000131
132 keep_blank_values: flag indicating whether blank values in
Tim Peters88869f92001-01-14 23:36:06 +0000133 URL encoded forms should be treated as blank strings.
134 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000135 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000136 blank values are to be ignored and treated as if they were
137 not included.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000138
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000139 strict_parsing: flag indicating what to do with parsing errors.
140 If false (the default), errors are silently ignored.
141 If true, errors raise a ValueError exception.
Guido van Rossum773ab271996-07-23 03:46:24 +0000142 """
Raymond Hettingera1449002002-05-31 23:54:44 +0000143 if fp is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000144 fp = sys.stdin
Raymond Hettinger54f02222002-06-01 14:18:47 +0000145 if not 'REQUEST_METHOD' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000146 environ['REQUEST_METHOD'] = 'GET' # For testing stand-alone
Guido van Rossum7aee3841996-03-07 18:00:44 +0000147 if environ['REQUEST_METHOD'] == 'POST':
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000148 ctype, pdict = parse_header(environ['CONTENT_TYPE'])
149 if ctype == 'multipart/form-data':
150 return parse_multipart(fp, pdict)
151 elif ctype == 'application/x-www-form-urlencoded':
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000152 clength = int(environ['CONTENT_LENGTH'])
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000153 if maxlen and clength > maxlen:
154 raise ValueError, 'Maximum content length exceeded'
155 qs = fp.read(clength)
156 else:
157 qs = '' # Unknown content-type
Raymond Hettinger54f02222002-06-01 14:18:47 +0000158 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000159 if qs: qs = qs + '&'
160 qs = qs + environ['QUERY_STRING']
Tim Peters88869f92001-01-14 23:36:06 +0000161 elif sys.argv[1:]:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000162 if qs: qs = qs + '&'
163 qs = qs + sys.argv[1]
164 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
Raymond Hettinger54f02222002-06-01 14:18:47 +0000165 elif 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000166 qs = environ['QUERY_STRING']
Guido van Rossum7aee3841996-03-07 18:00:44 +0000167 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000168 if sys.argv[1:]:
169 qs = sys.argv[1]
170 else:
171 qs = ""
172 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
Guido van Rossume08c04c1996-11-11 19:29:11 +0000173 return parse_qs(qs, keep_blank_values, strict_parsing)
Guido van Rossume7808771995-08-07 20:12:09 +0000174
175
Guido van Rossume08c04c1996-11-11 19:29:11 +0000176def parse_qs(qs, keep_blank_values=0, strict_parsing=0):
177 """Parse a query given as a string argument.
Guido van Rossum773ab271996-07-23 03:46:24 +0000178
179 Arguments:
180
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000181 qs: URL-encoded query string to be parsed
Guido van Rossum773ab271996-07-23 03:46:24 +0000182
183 keep_blank_values: flag indicating whether blank values in
Tim Peters88869f92001-01-14 23:36:06 +0000184 URL encoded queries should be treated as blank strings.
185 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000186 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000187 blank values are to be ignored and treated as if they were
188 not included.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000189
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000190 strict_parsing: flag indicating what to do with parsing errors.
191 If false (the default), errors are silently ignored.
192 If true, errors raise a ValueError exception.
Guido van Rossum773ab271996-07-23 03:46:24 +0000193 """
Guido van Rossum7aee3841996-03-07 18:00:44 +0000194 dict = {}
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000195 for name, value in parse_qsl(qs, keep_blank_values, strict_parsing):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000196 if name in dict:
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000197 dict[name].append(value)
198 else:
199 dict[name] = [value]
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000200 return dict
201
202def parse_qsl(qs, keep_blank_values=0, strict_parsing=0):
203 """Parse a query given as a string argument.
204
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000205 Arguments:
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000206
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000207 qs: URL-encoded query string to be parsed
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000208
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000209 keep_blank_values: flag indicating whether blank values in
210 URL encoded queries should be treated as blank strings. A
211 true value indicates that blanks should be retained as blank
212 strings. The default false value indicates that blank values
213 are to be ignored and treated as if they were not included.
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000214
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000215 strict_parsing: flag indicating what to do with parsing errors. If
216 false (the default), errors are silently ignored. If true,
Tim Peters88869f92001-01-14 23:36:06 +0000217 errors raise a ValueError exception.
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000218
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000219 Returns a list, as G-d intended.
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000220 """
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000221 pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
222 r = []
223 for name_value in pairs:
Neil Schemenauer66edb622004-07-19 15:38:11 +0000224 if not name_value and not strict_parsing:
225 continue
Jeremy Hyltonafde7e22000-09-15 20:06:57 +0000226 nv = name_value.split('=', 1)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000227 if len(nv) != 2:
228 if strict_parsing:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000229 raise ValueError, "bad query field: %r" % (name_value,)
Brett Cannon8d9b60f2004-03-21 22:16:15 +0000230 # Handle case of a control-name with no equal sign
231 if keep_blank_values:
232 nv.append('')
233 else:
234 continue
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000235 if len(nv[1]) or keep_blank_values:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000236 name = urllib.unquote(nv[0].replace('+', ' '))
237 value = urllib.unquote(nv[1].replace('+', ' '))
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000238 r.append((name, value))
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000239
240 return r
Guido van Rossum9a22de11995-01-12 12:29:47 +0000241
242
Guido van Rossum0147db01996-03-09 03:16:04 +0000243def parse_multipart(fp, pdict):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000244 """Parse multipart input.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000245
Guido van Rossum7aee3841996-03-07 18:00:44 +0000246 Arguments:
247 fp : input file
Johannes Gijsbersc7fc10a2005-01-08 13:56:36 +0000248 pdict: dictionary containing other parameters of content-type header
Guido van Rossum72755611996-03-06 07:20:06 +0000249
Tim Peters88869f92001-01-14 23:36:06 +0000250 Returns a dictionary just like parse_qs(): keys are the field names, each
251 value is a list of values for that field. This is easy to use but not
252 much good if you are expecting megabytes to be uploaded -- in that case,
253 use the FieldStorage class instead which is much more flexible. Note
254 that content-type is the raw, unparsed contents of the content-type
Guido van Rossum0147db01996-03-09 03:16:04 +0000255 header.
Tim Peters88869f92001-01-14 23:36:06 +0000256
257 XXX This does not parse nested multipart parts -- use FieldStorage for
Guido van Rossum0147db01996-03-09 03:16:04 +0000258 that.
Tim Peters88869f92001-01-14 23:36:06 +0000259
260 XXX This should really be subsumed by FieldStorage altogether -- no
Guido van Rossum0147db01996-03-09 03:16:04 +0000261 point in having two implementations of the same parsing algorithm.
Guido van Rossum9568b732006-08-10 17:41:07 +0000262 Also, FieldStorage protects itself better against certain DoS attacks
263 by limiting the size of the data read in one chunk. The API here
264 does not support that kind of protection. This also affects parse()
265 since it can call parse_multipart().
Guido van Rossum72755611996-03-06 07:20:06 +0000266
Guido van Rossum7aee3841996-03-07 18:00:44 +0000267 """
Guido van Rossum2e441f72001-07-25 21:00:19 +0000268 boundary = ""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000269 if 'boundary' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000270 boundary = pdict['boundary']
Guido van Rossum2e441f72001-07-25 21:00:19 +0000271 if not valid_boundary(boundary):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000272 raise ValueError, ('Invalid boundary in multipart form: %r'
273 % (boundary,))
Tim Petersab9ba272001-08-09 21:40:30 +0000274
Guido van Rossum7aee3841996-03-07 18:00:44 +0000275 nextpart = "--" + boundary
276 lastpart = "--" + boundary + "--"
277 partdict = {}
278 terminator = ""
279
280 while terminator != lastpart:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000281 bytes = -1
282 data = None
283 if terminator:
284 # At start of next part. Read headers first.
Armin Rigo3a703b62005-09-19 09:11:04 +0000285 headers = mimetools.Message(fp)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000286 clength = headers.getheader('content-length')
287 if clength:
288 try:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000289 bytes = int(clength)
290 except ValueError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000291 pass
292 if bytes > 0:
293 if maxlen and bytes > maxlen:
294 raise ValueError, 'Maximum content length exceeded'
295 data = fp.read(bytes)
296 else:
297 data = ""
298 # Read lines until end of part.
299 lines = []
300 while 1:
301 line = fp.readline()
302 if not line:
303 terminator = lastpart # End outer loop
304 break
305 if line[:2] == "--":
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000306 terminator = line.strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000307 if terminator in (nextpart, lastpart):
308 break
309 lines.append(line)
310 # Done with part.
311 if data is None:
312 continue
313 if bytes < 0:
314 if lines:
315 # Strip final line terminator
316 line = lines[-1]
317 if line[-2:] == "\r\n":
318 line = line[:-2]
319 elif line[-1:] == "\n":
320 line = line[:-1]
321 lines[-1] = line
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000322 data = "".join(lines)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000323 line = headers['content-disposition']
324 if not line:
325 continue
326 key, params = parse_header(line)
327 if key != 'form-data':
328 continue
Raymond Hettinger54f02222002-06-01 14:18:47 +0000329 if 'name' in params:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000330 name = params['name']
331 else:
332 continue
Raymond Hettinger54f02222002-06-01 14:18:47 +0000333 if name in partdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000334 partdict[name].append(data)
335 else:
336 partdict[name] = [data]
Guido van Rossum72755611996-03-06 07:20:06 +0000337
Guido van Rossum7aee3841996-03-07 18:00:44 +0000338 return partdict
Guido van Rossum9a22de11995-01-12 12:29:47 +0000339
340
Guido van Rossum72755611996-03-06 07:20:06 +0000341def parse_header(line):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000342 """Parse a Content-type like header.
343
344 Return the main content-type and a dictionary of options.
345
346 """
Raymond Hettingerf871d832004-12-31 21:59:02 +0000347 plist = [x.strip() for x in line.split(';')]
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000348 key = plist.pop(0).lower()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000349 pdict = {}
350 for p in plist:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000351 i = p.find('=')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000352 if i >= 0:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000353 name = p[:i].strip().lower()
354 value = p[i+1:].strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000355 if len(value) >= 2 and value[0] == value[-1] == '"':
356 value = value[1:-1]
Johannes Gijsbers9e15dd62004-08-14 15:39:34 +0000357 value = value.replace('\\\\', '\\').replace('\\"', '"')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000358 pdict[name] = value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000359 return key, pdict
Guido van Rossum72755611996-03-06 07:20:06 +0000360
361
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000362# Classes for field storage
363# =========================
364
365class MiniFieldStorage:
366
Guido van Rossum0147db01996-03-09 03:16:04 +0000367 """Like FieldStorage, for use when no file uploads are possible."""
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000368
Guido van Rossum7aee3841996-03-07 18:00:44 +0000369 # Dummy attributes
370 filename = None
371 list = None
372 type = None
Guido van Rossum773ab271996-07-23 03:46:24 +0000373 file = None
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000374 type_options = {}
Guido van Rossum7aee3841996-03-07 18:00:44 +0000375 disposition = None
376 disposition_options = {}
377 headers = {}
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000378
Guido van Rossum7aee3841996-03-07 18:00:44 +0000379 def __init__(self, name, value):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000380 """Constructor from field name and value."""
381 self.name = name
382 self.value = value
Guido van Rossum773ab271996-07-23 03:46:24 +0000383 # self.file = StringIO(value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000384
385 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000386 """Return printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000387 return "MiniFieldStorage(%r, %r)" % (self.name, self.value)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000388
389
390class FieldStorage:
391
Guido van Rossum7aee3841996-03-07 18:00:44 +0000392 """Store a sequence of fields, reading multipart/form-data.
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000393
Guido van Rossum7aee3841996-03-07 18:00:44 +0000394 This class provides naming, typing, files stored on disk, and
395 more. At the top level, it is accessible like a dictionary, whose
396 keys are the field names. (Note: None can occur as a field name.)
397 The items are either a Python list (if there's multiple values) or
398 another FieldStorage or MiniFieldStorage object. If it's a single
399 object, it has the following attributes:
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000400
Guido van Rossum7aee3841996-03-07 18:00:44 +0000401 name: the field name, if specified; otherwise None
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000402
Guido van Rossum7aee3841996-03-07 18:00:44 +0000403 filename: the filename, if specified; otherwise None; this is the
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000404 client side filename, *not* the file name on which it is
405 stored (that's a temporary file you don't deal with)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000406
Guido van Rossum7aee3841996-03-07 18:00:44 +0000407 value: the value as a *string*; for file uploads, this
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000408 transparently reads the file every time you request the value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000409
410 file: the file(-like) object from which you can read the data;
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000411 None if the data is stored a simple string
Guido van Rossum7aee3841996-03-07 18:00:44 +0000412
413 type: the content-type, or None if not specified
414
415 type_options: dictionary of options specified on the content-type
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000416 line
Guido van Rossum7aee3841996-03-07 18:00:44 +0000417
418 disposition: content-disposition, or None if not specified
419
420 disposition_options: dictionary of corresponding options
421
Armin Rigo3a703b62005-09-19 09:11:04 +0000422 headers: a dictionary(-like) object (sometimes rfc822.Message or a
423 subclass thereof) containing *all* headers
Guido van Rossum7aee3841996-03-07 18:00:44 +0000424
425 The class is subclassable, mostly for the purpose of overriding
426 the make_file() method, which is called internally to come up with
427 a file open for reading and writing. This makes it possible to
428 override the default choice of storing all files in a temporary
429 directory and unlinking them as soon as they have been opened.
430
431 """
432
Guido van Rossum773ab271996-07-23 03:46:24 +0000433 def __init__(self, fp=None, headers=None, outerboundary="",
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000434 environ=os.environ, keep_blank_values=0, strict_parsing=0):
435 """Constructor. Read multipart/* until last part.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000436
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000437 Arguments, all optional:
Guido van Rossum7aee3841996-03-07 18:00:44 +0000438
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000439 fp : file pointer; default: sys.stdin
Guido van Rossumb1b4f941998-05-08 19:55:51 +0000440 (not used when the request method is GET)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000441
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000442 headers : header dictionary-like object; default:
443 taken from environ as per CGI spec
Guido van Rossum7aee3841996-03-07 18:00:44 +0000444
Guido van Rossum773ab271996-07-23 03:46:24 +0000445 outerboundary : terminating multipart boundary
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000446 (for internal use only)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000447
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000448 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000449
450 keep_blank_values: flag indicating whether blank values in
Tim Peters88869f92001-01-14 23:36:06 +0000451 URL encoded forms should be treated as blank strings.
452 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000453 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000454 blank values are to be ignored and treated as if they were
455 not included.
Guido van Rossum773ab271996-07-23 03:46:24 +0000456
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000457 strict_parsing: flag indicating what to do with parsing errors.
458 If false (the default), errors are silently ignored.
459 If true, errors raise a ValueError exception.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000460
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000461 """
462 method = 'GET'
463 self.keep_blank_values = keep_blank_values
464 self.strict_parsing = strict_parsing
Raymond Hettinger54f02222002-06-01 14:18:47 +0000465 if 'REQUEST_METHOD' in environ:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000466 method = environ['REQUEST_METHOD'].upper()
Facundo Batistaa6a4d502008-06-21 18:58:04 +0000467 self.qs_on_post = None
Guido van Rossum01852831998-06-25 02:40:17 +0000468 if method == 'GET' or method == 'HEAD':
Raymond Hettinger54f02222002-06-01 14:18:47 +0000469 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000470 qs = environ['QUERY_STRING']
471 elif sys.argv[1:]:
472 qs = sys.argv[1]
473 else:
474 qs = ""
475 fp = StringIO(qs)
476 if headers is None:
477 headers = {'content-type':
478 "application/x-www-form-urlencoded"}
479 if headers is None:
Guido van Rossumcff311a1998-06-11 14:06:59 +0000480 headers = {}
481 if method == 'POST':
482 # Set default content-type for POST to what's traditional
483 headers['content-type'] = "application/x-www-form-urlencoded"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000484 if 'CONTENT_TYPE' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000485 headers['content-type'] = environ['CONTENT_TYPE']
Facundo Batistaa6a4d502008-06-21 18:58:04 +0000486 if 'QUERY_STRING' in environ:
487 self.qs_on_post = environ['QUERY_STRING']
Raymond Hettinger54f02222002-06-01 14:18:47 +0000488 if 'CONTENT_LENGTH' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000489 headers['content-length'] = environ['CONTENT_LENGTH']
490 self.fp = fp or sys.stdin
491 self.headers = headers
492 self.outerboundary = outerboundary
Guido van Rossum7aee3841996-03-07 18:00:44 +0000493
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000494 # Process content-disposition header
495 cdisp, pdict = "", {}
Raymond Hettinger54f02222002-06-01 14:18:47 +0000496 if 'content-disposition' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000497 cdisp, pdict = parse_header(self.headers['content-disposition'])
498 self.disposition = cdisp
499 self.disposition_options = pdict
500 self.name = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000501 if 'name' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000502 self.name = pdict['name']
503 self.filename = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000504 if 'filename' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000505 self.filename = pdict['filename']
Guido van Rossum7aee3841996-03-07 18:00:44 +0000506
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000507 # Process content-type header
Barry Warsaw302331a1999-01-08 17:42:03 +0000508 #
509 # Honor any existing content-type header. But if there is no
510 # content-type header, use some sensible defaults. Assume
511 # outerboundary is "" at the outer level, but something non-false
512 # inside a multi-part. The default for an inner part is text/plain,
513 # but for an outer part it should be urlencoded. This should catch
514 # bogus clients which erroneously forget to include a content-type
515 # header.
516 #
517 # See below for what we do if there does exist a content-type header,
518 # but it happens to be something we don't understand.
Raymond Hettinger54f02222002-06-01 14:18:47 +0000519 if 'content-type' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000520 ctype, pdict = parse_header(self.headers['content-type'])
Guido van Rossumce900de1999-06-02 18:44:22 +0000521 elif self.outerboundary or method != 'POST':
Barry Warsaw302331a1999-01-08 17:42:03 +0000522 ctype, pdict = "text/plain", {}
523 else:
524 ctype, pdict = 'application/x-www-form-urlencoded', {}
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000525 self.type = ctype
526 self.type_options = pdict
527 self.innerboundary = ""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000528 if 'boundary' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000529 self.innerboundary = pdict['boundary']
530 clen = -1
Raymond Hettinger54f02222002-06-01 14:18:47 +0000531 if 'content-length' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000532 try:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000533 clen = int(self.headers['content-length'])
Skip Montanarodb5d1442002-03-23 05:50:17 +0000534 except ValueError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000535 pass
536 if maxlen and clen > maxlen:
537 raise ValueError, 'Maximum content length exceeded'
538 self.length = clen
Guido van Rossum7aee3841996-03-07 18:00:44 +0000539
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000540 self.list = self.file = None
541 self.done = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000542 if ctype == 'application/x-www-form-urlencoded':
543 self.read_urlencoded()
544 elif ctype[:10] == 'multipart/':
Guido van Rossumf5745001998-10-20 14:43:02 +0000545 self.read_multi(environ, keep_blank_values, strict_parsing)
Barry Warsaw302331a1999-01-08 17:42:03 +0000546 else:
Guido van Rossum60a3bd81999-06-11 18:26:09 +0000547 self.read_single()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000548
549 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000550 """Return a printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000551 return "FieldStorage(%r, %r, %r)" % (
552 self.name, self.filename, self.value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000553
Guido van Rossum4061cbe2002-09-11 18:20:34 +0000554 def __iter__(self):
555 return iter(self.keys())
556
Guido van Rossum7aee3841996-03-07 18:00:44 +0000557 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000558 if name != 'value':
559 raise AttributeError, name
560 if self.file:
561 self.file.seek(0)
562 value = self.file.read()
563 self.file.seek(0)
564 elif self.list is not None:
565 value = self.list
566 else:
567 value = None
568 return value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000569
570 def __getitem__(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000571 """Dictionary style indexing."""
572 if self.list is None:
573 raise TypeError, "not indexable"
574 found = []
575 for item in self.list:
576 if item.name == key: found.append(item)
577 if not found:
578 raise KeyError, key
579 if len(found) == 1:
580 return found[0]
581 else:
582 return found
Guido van Rossum7aee3841996-03-07 18:00:44 +0000583
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000584 def getvalue(self, key, default=None):
585 """Dictionary style get() method, including 'value' lookup."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000586 if key in self:
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000587 value = self[key]
588 if type(value) is type([]):
Raymond Hettingerf871d832004-12-31 21:59:02 +0000589 return map(attrgetter('value'), value)
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000590 else:
591 return value.value
592 else:
593 return default
594
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000595 def getfirst(self, key, default=None):
596 """ Return the first value received."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000597 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000598 value = self[key]
599 if type(value) is type([]):
600 return value[0].value
601 else:
602 return value.value
603 else:
604 return default
605
606 def getlist(self, key):
607 """ Return list of received values."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000608 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000609 value = self[key]
610 if type(value) is type([]):
Raymond Hettingerf871d832004-12-31 21:59:02 +0000611 return map(attrgetter('value'), value)
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000612 else:
613 return [value.value]
614 else:
615 return []
616
Guido van Rossum7aee3841996-03-07 18:00:44 +0000617 def keys(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000618 """Dictionary style keys() method."""
619 if self.list is None:
620 raise TypeError, "not indexable"
Georg Brandlaff85e22007-09-20 16:06:07 +0000621 return list(set(item.name for item in self.list))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000622
Guido van Rossum0147db01996-03-09 03:16:04 +0000623 def has_key(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000624 """Dictionary style has_key() method."""
625 if self.list is None:
626 raise TypeError, "not indexable"
Georg Brandlaff85e22007-09-20 16:06:07 +0000627 return any(item.name == key for item in self.list)
Guido van Rossum0147db01996-03-09 03:16:04 +0000628
Raymond Hettinger54f02222002-06-01 14:18:47 +0000629 def __contains__(self, key):
630 """Dictionary style __contains__ method."""
631 if self.list is None:
632 raise TypeError, "not indexable"
Georg Brandlaff85e22007-09-20 16:06:07 +0000633 return any(item.name == key for item in self.list)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000634
Guido van Rossum88b85d41997-01-11 19:21:33 +0000635 def __len__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000636 """Dictionary style len(x) support."""
637 return len(self.keys())
Guido van Rossum88b85d41997-01-11 19:21:33 +0000638
Georg Brandlaff85e22007-09-20 16:06:07 +0000639 def __nonzero__(self):
640 return bool(self.list)
641
Guido van Rossum7aee3841996-03-07 18:00:44 +0000642 def read_urlencoded(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000643 """Internal: read data in query string format."""
644 qs = self.fp.read(self.length)
Facundo Batistaa6a4d502008-06-21 18:58:04 +0000645 if self.qs_on_post:
646 qs += '&' + self.qs_on_post
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000647 self.list = list = []
648 for key, value in parse_qsl(qs, self.keep_blank_values,
649 self.strict_parsing):
650 list.append(MiniFieldStorage(key, value))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000651 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000652
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000653 FieldStorageClass = None
654
Guido van Rossumf5745001998-10-20 14:43:02 +0000655 def read_multi(self, environ, keep_blank_values, strict_parsing):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000656 """Internal: read a part that is itself multipart."""
Guido van Rossum2e441f72001-07-25 21:00:19 +0000657 ib = self.innerboundary
658 if not valid_boundary(ib):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000659 raise ValueError, 'Invalid boundary in multipart form: %r' % (ib,)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000660 self.list = []
Facundo Batistaa6a4d502008-06-21 18:58:04 +0000661 if self.qs_on_post:
662 for key, value in parse_qsl(self.qs_on_post, self.keep_blank_values,
663 self.strict_parsing):
664 self.list.append(MiniFieldStorage(key, value))
665 FieldStorageClass = None
666
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000667 klass = self.FieldStorageClass or self.__class__
Guido van Rossum2e441f72001-07-25 21:00:19 +0000668 part = klass(self.fp, {}, ib,
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000669 environ, keep_blank_values, strict_parsing)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000670 # Throw first part away
671 while not part.done:
Armin Rigo3a703b62005-09-19 09:11:04 +0000672 headers = rfc822.Message(self.fp)
Guido van Rossum2e441f72001-07-25 21:00:19 +0000673 part = klass(self.fp, headers, ib,
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000674 environ, keep_blank_values, strict_parsing)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000675 self.list.append(part)
676 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000677
678 def read_single(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000679 """Internal: read an atomic part."""
680 if self.length >= 0:
681 self.read_binary()
682 self.skip_lines()
683 else:
684 self.read_lines()
685 self.file.seek(0)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000686
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000687 bufsize = 8*1024 # I/O buffering size for copy to file
Guido van Rossum7aee3841996-03-07 18:00:44 +0000688
689 def read_binary(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000690 """Internal: read binary data."""
691 self.file = self.make_file('b')
692 todo = self.length
693 if todo >= 0:
694 while todo > 0:
695 data = self.fp.read(min(todo, self.bufsize))
696 if not data:
697 self.done = -1
698 break
699 self.file.write(data)
700 todo = todo - len(data)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000701
702 def read_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000703 """Internal: read lines until EOF or outerboundary."""
Guido van Rossum52b8c292001-06-29 13:06:06 +0000704 self.file = self.__file = StringIO()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000705 if self.outerboundary:
706 self.read_lines_to_outerboundary()
707 else:
708 self.read_lines_to_eof()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000709
Guido van Rossum52b8c292001-06-29 13:06:06 +0000710 def __write(self, line):
711 if self.__file is not None:
712 if self.__file.tell() + len(line) > 1000:
713 self.file = self.make_file('')
714 self.file.write(self.__file.getvalue())
715 self.__file = None
716 self.file.write(line)
717
Guido van Rossum7aee3841996-03-07 18:00:44 +0000718 def read_lines_to_eof(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000719 """Internal: read lines until EOF."""
720 while 1:
Guido van Rossum9568b732006-08-10 17:41:07 +0000721 line = self.fp.readline(1<<16)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000722 if not line:
723 self.done = -1
724 break
Guido van Rossum52b8c292001-06-29 13:06:06 +0000725 self.__write(line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000726
727 def read_lines_to_outerboundary(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000728 """Internal: read lines until outerboundary."""
729 next = "--" + self.outerboundary
730 last = next + "--"
731 delim = ""
Guido van Rossum9568b732006-08-10 17:41:07 +0000732 last_line_lfend = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000733 while 1:
Guido van Rossum9568b732006-08-10 17:41:07 +0000734 line = self.fp.readline(1<<16)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000735 if not line:
736 self.done = -1
737 break
Guido van Rossum9568b732006-08-10 17:41:07 +0000738 if line[:2] == "--" and last_line_lfend:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000739 strippedline = line.strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000740 if strippedline == next:
741 break
742 if strippedline == last:
743 self.done = 1
744 break
745 odelim = delim
746 if line[-2:] == "\r\n":
747 delim = "\r\n"
748 line = line[:-2]
Guido van Rossum9568b732006-08-10 17:41:07 +0000749 last_line_lfend = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000750 elif line[-1] == "\n":
751 delim = "\n"
752 line = line[:-1]
Guido van Rossum9568b732006-08-10 17:41:07 +0000753 last_line_lfend = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000754 else:
755 delim = ""
Guido van Rossum9568b732006-08-10 17:41:07 +0000756 last_line_lfend = False
Guido van Rossum52b8c292001-06-29 13:06:06 +0000757 self.__write(odelim + line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000758
759 def skip_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000760 """Internal: skip lines until outer boundary if defined."""
761 if not self.outerboundary or self.done:
762 return
763 next = "--" + self.outerboundary
764 last = next + "--"
Guido van Rossum9568b732006-08-10 17:41:07 +0000765 last_line_lfend = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000766 while 1:
Guido van Rossum9568b732006-08-10 17:41:07 +0000767 line = self.fp.readline(1<<16)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000768 if not line:
769 self.done = -1
770 break
Guido van Rossum9568b732006-08-10 17:41:07 +0000771 if line[:2] == "--" and last_line_lfend:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000772 strippedline = line.strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000773 if strippedline == next:
774 break
775 if strippedline == last:
776 self.done = 1
777 break
Guido van Rossum9568b732006-08-10 17:41:07 +0000778 last_line_lfend = line.endswith('\n')
Guido van Rossum7aee3841996-03-07 18:00:44 +0000779
Guido van Rossuma5e9fb61997-08-12 18:18:13 +0000780 def make_file(self, binary=None):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000781 """Overridable: return a readable & writable file.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000782
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000783 The file will be used as follows:
784 - data is written to it
785 - seek(0)
786 - data is read from it
Guido van Rossum7aee3841996-03-07 18:00:44 +0000787
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000788 The 'binary' argument is unused -- the file is always opened
789 in binary mode.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000790
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000791 This version opens a temporary file for reading and writing,
792 and immediately deletes (unlinks) it. The trick (on Unix!) is
793 that the file can still be used, but it can't be opened by
794 another process, and it will automatically be deleted when it
795 is closed or when the current process terminates.
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000796
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000797 If you want a more permanent file, you derive a class which
798 overrides this method. If you want a visible temporary file
799 that is nevertheless automatically deleted when the script
800 terminates, try defining a __del__ method in a derived class
801 which unlinks the temporary files you have created.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000802
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000803 """
804 import tempfile
805 return tempfile.TemporaryFile("w+b")
Tim Peters88869f92001-01-14 23:36:06 +0000806
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000807
808
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000809# Backwards Compatibility Classes
810# ===============================
Guido van Rossum9a22de11995-01-12 12:29:47 +0000811
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000812class FormContentDict(UserDict.UserDict):
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000813 """Form content as dictionary with a list of values per field.
Guido van Rossum72755611996-03-06 07:20:06 +0000814
Guido van Rossum7aee3841996-03-07 18:00:44 +0000815 form = FormContentDict()
816
817 form[key] -> [value, value, ...]
Raymond Hettinger54f02222002-06-01 14:18:47 +0000818 key in form -> Boolean
Guido van Rossum7aee3841996-03-07 18:00:44 +0000819 form.keys() -> [key, key, ...]
820 form.values() -> [[val, val, ...], [val, val, ...], ...]
821 form.items() -> [(key, [val, val, ...]), (key, [val, val, ...]), ...]
822 form.dict == {key: [val, val, ...], ...}
823
824 """
Georg Brandl05b3c452006-09-30 10:58:01 +0000825 def __init__(self, environ=os.environ, keep_blank_values=0, strict_parsing=0):
826 self.dict = self.data = parse(environ=environ,
827 keep_blank_values=keep_blank_values,
828 strict_parsing=strict_parsing)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000829 self.query_string = environ['QUERY_STRING']
Guido van Rossum9a22de11995-01-12 12:29:47 +0000830
831
Guido van Rossum9a22de11995-01-12 12:29:47 +0000832class SvFormContentDict(FormContentDict):
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000833 """Form content as dictionary expecting a single value per field.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000834
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000835 If you only expect a single value for each field, then form[key]
Guido van Rossum7aee3841996-03-07 18:00:44 +0000836 will return that single value. It will raise an IndexError if
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000837 that expectation is not true. If you expect a field to have
Guido van Rossum7aee3841996-03-07 18:00:44 +0000838 possible multiple values, than you can use form.getlist(key) to
839 get all of the values. values() and items() are a compromise:
840 they return single strings where there is a single value, and
841 lists of strings otherwise.
842
843 """
844 def __getitem__(self, key):
Tim Peters88869f92001-01-14 23:36:06 +0000845 if len(self.dict[key]) > 1:
846 raise IndexError, 'expecting a single value'
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000847 return self.dict[key][0]
Guido van Rossum7aee3841996-03-07 18:00:44 +0000848 def getlist(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000849 return self.dict[key]
Guido van Rossum7aee3841996-03-07 18:00:44 +0000850 def values(self):
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000851 result = []
852 for value in self.dict.values():
853 if len(value) == 1:
854 result.append(value[0])
855 else: result.append(value)
856 return result
Guido van Rossum7aee3841996-03-07 18:00:44 +0000857 def items(self):
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000858 result = []
859 for key, value in self.dict.items():
860 if len(value) == 1:
861 result.append((key, value[0]))
862 else: result.append((key, value))
863 return result
Guido van Rossum9a22de11995-01-12 12:29:47 +0000864
865
Guido van Rossum9a22de11995-01-12 12:29:47 +0000866class InterpFormContentDict(SvFormContentDict):
Tim Peters88869f92001-01-14 23:36:06 +0000867 """This class is present for backwards compatibility only."""
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000868 def __getitem__(self, key):
869 v = SvFormContentDict.__getitem__(self, key)
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000870 if v[0] in '0123456789+-.':
871 try: return int(v)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000872 except ValueError:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000873 try: return float(v)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000874 except ValueError: pass
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000875 return v.strip()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000876 def values(self):
877 result = []
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000878 for key in self.keys():
879 try:
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000880 result.append(self[key])
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000881 except IndexError:
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000882 result.append(self.dict[key])
883 return result
884 def items(self):
885 result = []
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000886 for key in self.keys():
887 try:
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000888 result.append((key, self[key]))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000889 except IndexError:
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000890 result.append((key, self.dict[key]))
891 return result
Guido van Rossum9a22de11995-01-12 12:29:47 +0000892
893
Guido van Rossum9a22de11995-01-12 12:29:47 +0000894class FormContent(FormContentDict):
Tim Peters88869f92001-01-14 23:36:06 +0000895 """This class is present for backwards compatibility only."""
Guido van Rossum0147db01996-03-09 03:16:04 +0000896 def values(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000897 if key in self.dict :return self.dict[key]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000898 else: return None
Guido van Rossum0147db01996-03-09 03:16:04 +0000899 def indexed_value(self, key, location):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000900 if key in self.dict:
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000901 if len(self.dict[key]) > location:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000902 return self.dict[key][location]
903 else: return None
904 else: return None
Guido van Rossum0147db01996-03-09 03:16:04 +0000905 def value(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000906 if key in self.dict: return self.dict[key][0]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000907 else: return None
Guido van Rossum0147db01996-03-09 03:16:04 +0000908 def length(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000909 return len(self.dict[key])
Guido van Rossum0147db01996-03-09 03:16:04 +0000910 def stripped(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000911 if key in self.dict: return self.dict[key][0].strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000912 else: return None
Guido van Rossum7aee3841996-03-07 18:00:44 +0000913 def pars(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000914 return self.dict
Guido van Rossum9a22de11995-01-12 12:29:47 +0000915
916
Guido van Rossum72755611996-03-06 07:20:06 +0000917# Test/debug code
918# ===============
Guido van Rossum9a22de11995-01-12 12:29:47 +0000919
Guido van Rossum773ab271996-07-23 03:46:24 +0000920def test(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000921 """Robust test CGI script, usable as main program.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000922
Guido van Rossum7aee3841996-03-07 18:00:44 +0000923 Write minimal HTTP headers and dump all information provided to
924 the script in HTML form.
925
926 """
Guido van Rossum7aee3841996-03-07 18:00:44 +0000927 print "Content-type: text/html"
928 print
929 sys.stderr = sys.stdout
930 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000931 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000932 print_directory()
933 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000934 print_form(form)
935 print_environ(environ)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000936 print_environ_usage()
937 def f():
938 exec "testing print_exception() -- <I>italics?</I>"
939 def g(f=f):
940 f()
941 print "<H3>What follows is a test, not an actual exception:</H3>"
942 g()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000943 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000944 print_exception()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000945
Guido van Rossum57d51f22000-09-16 21:16:01 +0000946 print "<H1>Second try with a small maxlen...</H1>"
947
Guido van Rossumad164711997-05-13 19:03:23 +0000948 global maxlen
949 maxlen = 50
950 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000951 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000952 print_directory()
953 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000954 print_form(form)
955 print_environ(environ)
Guido van Rossumad164711997-05-13 19:03:23 +0000956 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000957 print_exception()
Guido van Rossumad164711997-05-13 19:03:23 +0000958
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000959def print_exception(type=None, value=None, tb=None, limit=None):
960 if type is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000961 type, value, tb = sys.exc_info()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000962 import traceback
963 print
Guido van Rossum7dd06962000-12-27 19:12:58 +0000964 print "<H3>Traceback (most recent call last):</H3>"
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000965 list = traceback.format_tb(tb, limit) + \
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000966 traceback.format_exception_only(type, value)
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000967 print "<PRE>%s<B>%s</B></PRE>" % (
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000968 escape("".join(list[:-1])),
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000969 escape(list[-1]),
970 )
Guido van Rossumf15d1591997-09-29 23:22:12 +0000971 del tb
Guido van Rossum9a22de11995-01-12 12:29:47 +0000972
Guido van Rossum773ab271996-07-23 03:46:24 +0000973def print_environ(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000974 """Dump the shell environment as HTML."""
975 keys = environ.keys()
976 keys.sort()
977 print
Guido van Rossum503e50b1996-05-28 22:57:20 +0000978 print "<H3>Shell Environment:</H3>"
Guido van Rossum7aee3841996-03-07 18:00:44 +0000979 print "<DL>"
980 for key in keys:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000981 print "<DT>", escape(key), "<DD>", escape(environ[key])
Tim Peters88869f92001-01-14 23:36:06 +0000982 print "</DL>"
Guido van Rossum7aee3841996-03-07 18:00:44 +0000983 print
Guido van Rossum72755611996-03-06 07:20:06 +0000984
985def print_form(form):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000986 """Dump the contents of a form as HTML."""
987 keys = form.keys()
988 keys.sort()
989 print
Guido van Rossum503e50b1996-05-28 22:57:20 +0000990 print "<H3>Form Contents:</H3>"
Guido van Rossum57d51f22000-09-16 21:16:01 +0000991 if not keys:
992 print "<P>No form fields."
Guido van Rossum7aee3841996-03-07 18:00:44 +0000993 print "<DL>"
994 for key in keys:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000995 print "<DT>" + escape(key) + ":",
996 value = form[key]
Walter Dörwald70a6b492004-02-12 17:35:32 +0000997 print "<i>" + escape(repr(type(value))) + "</i>"
998 print "<DD>" + escape(repr(value))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000999 print "</DL>"
1000 print
1001
1002def print_directory():
1003 """Dump the current directory as HTML."""
1004 print
1005 print "<H3>Current Working Directory:</H3>"
1006 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001007 pwd = os.getcwd()
Guido van Rossum7aee3841996-03-07 18:00:44 +00001008 except os.error, msg:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001009 print "os.error:", escape(str(msg))
Guido van Rossum7aee3841996-03-07 18:00:44 +00001010 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001011 print escape(pwd)
Guido van Rossum7aee3841996-03-07 18:00:44 +00001012 print
Guido van Rossum9a22de11995-01-12 12:29:47 +00001013
Guido van Rossuma8738a51996-03-14 21:30:28 +00001014def print_arguments():
1015 print
Guido van Rossum503e50b1996-05-28 22:57:20 +00001016 print "<H3>Command Line Arguments:</H3>"
Guido van Rossuma8738a51996-03-14 21:30:28 +00001017 print
1018 print sys.argv
1019 print
1020
Guido van Rossum9a22de11995-01-12 12:29:47 +00001021def print_environ_usage():
Guido van Rossum7aee3841996-03-07 18:00:44 +00001022 """Dump a list of environment variables used by CGI as HTML."""
1023 print """
Guido van Rossum72755611996-03-06 07:20:06 +00001024<H3>These environment variables could have been set:</H3>
1025<UL>
Guido van Rossum9a22de11995-01-12 12:29:47 +00001026<LI>AUTH_TYPE
1027<LI>CONTENT_LENGTH
1028<LI>CONTENT_TYPE
1029<LI>DATE_GMT
1030<LI>DATE_LOCAL
1031<LI>DOCUMENT_NAME
1032<LI>DOCUMENT_ROOT
1033<LI>DOCUMENT_URI
1034<LI>GATEWAY_INTERFACE
1035<LI>LAST_MODIFIED
1036<LI>PATH
1037<LI>PATH_INFO
1038<LI>PATH_TRANSLATED
1039<LI>QUERY_STRING
1040<LI>REMOTE_ADDR
1041<LI>REMOTE_HOST
1042<LI>REMOTE_IDENT
1043<LI>REMOTE_USER
1044<LI>REQUEST_METHOD
1045<LI>SCRIPT_NAME
1046<LI>SERVER_NAME
1047<LI>SERVER_PORT
1048<LI>SERVER_PROTOCOL
1049<LI>SERVER_ROOT
1050<LI>SERVER_SOFTWARE
1051</UL>
Guido van Rossum7aee3841996-03-07 18:00:44 +00001052In addition, HTTP headers sent by the server may be passed in the
1053environment as well. Here are some common variable names:
1054<UL>
1055<LI>HTTP_ACCEPT
1056<LI>HTTP_CONNECTION
1057<LI>HTTP_HOST
1058<LI>HTTP_PRAGMA
1059<LI>HTTP_REFERER
1060<LI>HTTP_USER_AGENT
1061</UL>
Guido van Rossum9a22de11995-01-12 12:29:47 +00001062"""
1063
Guido van Rossum9a22de11995-01-12 12:29:47 +00001064
Guido van Rossum72755611996-03-06 07:20:06 +00001065# Utilities
1066# =========
Guido van Rossum9a22de11995-01-12 12:29:47 +00001067
Guido van Rossum64c66201997-07-19 20:11:53 +00001068def escape(s, quote=None):
Skip Montanaro97b2fa22005-08-02 02:50:25 +00001069 '''Replace special characters "&", "<" and ">" to HTML-safe sequences.
1070 If the optional flag quote is true, the quotation mark character (")
1071 is also translated.'''
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +00001072 s = s.replace("&", "&amp;") # Must be done first!
1073 s = s.replace("<", "&lt;")
1074 s = s.replace(">", "&gt;")
Guido van Rossum64c66201997-07-19 20:11:53 +00001075 if quote:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +00001076 s = s.replace('"', "&quot;")
Guido van Rossum7aee3841996-03-07 18:00:44 +00001077 return s
Guido van Rossum9a22de11995-01-12 12:29:47 +00001078
Guido van Rossum2e441f72001-07-25 21:00:19 +00001079def valid_boundary(s, _vb_pattern="^[ -~]{0,200}[!-~]$"):
1080 import re
1081 return re.match(_vb_pattern, s)
Guido van Rossum9a22de11995-01-12 12:29:47 +00001082
Guido van Rossum72755611996-03-06 07:20:06 +00001083# Invoke mainline
1084# ===============
1085
1086# Call test() when this file is run as a script (not imported as a module)
Tim Peters88869f92001-01-14 23:36:06 +00001087if __name__ == '__main__':
Guido van Rossum7aee3841996-03-07 18:00:44 +00001088 test()