blob: f82cc6c8bd56d3f693ebb43eda5487faf8538e3a [file] [log] [blame]
Benjamin Peterson8c703a02010-03-11 22:05:58 +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
Guido van Rossum98d9fd32000-02-28 15:12:25 +000018# History
19# -------
Tim Peters88869f92001-01-14 23:36:06 +000020#
Guido van Rossum98d9fd32000-02-28 15:12:25 +000021# Michael McLay started this module. Steve Majewski changed the
22# interface to SvFormContentDict and FormContentDict. The multipart
23# parsing was inspired by code submitted by Andreas Paepcke. Guido van
24# Rossum rewrote, reformatted and documented the module and is currently
25# responsible for its maintenance.
Tim Peters88869f92001-01-14 23:36:06 +000026#
Guido van Rossum98d9fd32000-02-28 15:12:25 +000027
Guido van Rossum52b8c292001-06-29 13:06:06 +000028__version__ = "2.6"
Guido van Rossum0147db01996-03-09 03:16:04 +000029
Guido van Rossum72755611996-03-06 07:20:06 +000030
31# Imports
32# =======
33
Victor Stinner5c23b8e2011-01-14 13:05:21 +000034from io import StringIO, BytesIO, TextIOWrapper
Serhiy Storchaka2e576f52017-04-24 09:05:00 +030035from collections.abc import Mapping
Guido van Rossum72755611996-03-06 07:20:06 +000036import sys
37import os
Jeremy Hylton1afc1692008-06-18 20:49:58 +000038import urllib.parse
Victor Stinner5c23b8e2011-01-14 13:05:21 +000039from email.parser import FeedParser
Senthil Kumaranb4cbb922014-01-11 22:20:16 -080040from email.message import Message
Facundo Batistac469d4c2008-09-03 22:49:01 +000041from warnings import warn
Georg Brandl1f7fffb2010-10-15 15:57:45 +000042import html
Victor Stinner5c23b8e2011-01-14 13:05:21 +000043import locale
44import tempfile
Guido van Rossum72755611996-03-06 07:20:06 +000045
Georg Brandl49d1b4f2008-05-11 21:42:51 +000046__all__ = ["MiniFieldStorage", "FieldStorage",
Guido van Rossuma8423a92001-03-19 13:40:44 +000047 "parse", "parse_qs", "parse_qsl", "parse_multipart",
Martin Panter1cd27722016-06-06 01:53:28 +000048 "parse_header", "test", "print_exception", "print_environ",
Guido van Rossuma8423a92001-03-19 13:40:44 +000049 "print_form", "print_directory", "print_arguments",
50 "print_environ_usage", "escape"]
Guido van Rossumc204c701996-09-05 19:07:11 +000051
52# Logging support
53# ===============
54
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000055logfile = "" # Filename to log to, if not empty
56logfp = None # File object to log to, if not None
Guido van Rossumc204c701996-09-05 19:07:11 +000057
58def initlog(*allargs):
59 """Write a log message, if there is a log file.
60
61 Even though this function is called initlog(), you should always
62 use log(); log is a variable that is set either to initlog
63 (initially), to dolog (once the log file has been opened), or to
64 nolog (when logging is disabled).
65
66 The first argument is a format string; the remaining arguments (if
67 any) are arguments to the % operator, so e.g.
68 log("%s: %s", "a", "b")
69 will write "a: b" to the log file, followed by a newline.
70
71 If the global logfp is not None, it should be a file object to
72 which log data is written.
73
74 If the global logfp is None, the global logfile may be a string
75 giving a filename to open, in append mode. This file should be
76 world writable!!! If the file can't be opened, logging is
77 silently disabled (since there is no safe place where we could
78 send an error message).
79
80 """
Victor Stinnerd33344a2011-07-14 22:28:36 +020081 global log, logfile, logfp
Guido van Rossumc204c701996-09-05 19:07:11 +000082 if logfile and not logfp:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000083 try:
84 logfp = open(logfile, "a")
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020085 except OSError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000086 pass
Guido van Rossumc204c701996-09-05 19:07:11 +000087 if not logfp:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000088 log = nolog
Guido van Rossumc204c701996-09-05 19:07:11 +000089 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000090 log = dolog
Guido van Rossum68468eb2003-02-27 20:14:51 +000091 log(*allargs)
Guido van Rossumc204c701996-09-05 19:07:11 +000092
93def dolog(fmt, *args):
94 """Write a log message to the log file. See initlog() for docs."""
95 logfp.write(fmt%args + "\n")
96
97def nolog(*allargs):
98 """Dummy function, assigned to log when logging is disabled."""
99 pass
100
Victor Stinnerd33344a2011-07-14 22:28:36 +0200101def closelog():
102 """Close the log file."""
103 global log, logfile, logfp
104 logfile = ''
105 if logfp:
106 logfp.close()
107 logfp = None
108 log = initlog
109
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000110log = initlog # The current logging function
Guido van Rossumc204c701996-09-05 19:07:11 +0000111
112
Guido van Rossum72755611996-03-06 07:20:06 +0000113# Parsing functions
114# =================
115
Guido van Rossumad164711997-05-13 19:03:23 +0000116# Maximum input we will accept when REQUEST_METHOD is POST
117# 0 ==> unlimited input
118maxlen = 0
119
Guido van Rossume08c04c1996-11-11 19:29:11 +0000120def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0):
Guido van Rossum773ab271996-07-23 03:46:24 +0000121 """Parse a query in the environment or from a file (default stdin)
122
123 Arguments, all optional:
124
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000125 fp : file pointer; default: sys.stdin.buffer
Guido van Rossum773ab271996-07-23 03:46:24 +0000126
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000127 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000128
129 keep_blank_values: flag indicating whether blank values in
Senthil Kumaran30e86a42010-08-09 20:01:35 +0000130 percent-encoded forms should be treated as blank strings.
Tim Peters88869f92001-01-14 23:36:06 +0000131 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000132 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000133 blank values are to be ignored and treated as if they were
134 not included.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000135
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000136 strict_parsing: flag indicating what to do with parsing errors.
137 If false (the default), errors are silently ignored.
138 If true, errors raise a ValueError exception.
Guido van Rossum773ab271996-07-23 03:46:24 +0000139 """
Raymond Hettingera1449002002-05-31 23:54:44 +0000140 if fp is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000141 fp = sys.stdin
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000142
143 # field keys and values (except for files) are returned as strings
144 # an encoding is required to decode the bytes read from self.fp
145 if hasattr(fp,'encoding'):
146 encoding = fp.encoding
147 else:
148 encoding = 'latin-1'
149
150 # fp.read() must return bytes
151 if isinstance(fp, TextIOWrapper):
152 fp = fp.buffer
153
Raymond Hettinger54f02222002-06-01 14:18:47 +0000154 if not 'REQUEST_METHOD' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000155 environ['REQUEST_METHOD'] = 'GET' # For testing stand-alone
Guido van Rossum7aee3841996-03-07 18:00:44 +0000156 if environ['REQUEST_METHOD'] == 'POST':
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000157 ctype, pdict = parse_header(environ['CONTENT_TYPE'])
158 if ctype == 'multipart/form-data':
159 return parse_multipart(fp, pdict)
160 elif ctype == 'application/x-www-form-urlencoded':
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000161 clength = int(environ['CONTENT_LENGTH'])
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000162 if maxlen and clength > maxlen:
Collin Winterce36ad82007-08-30 01:19:48 +0000163 raise ValueError('Maximum content length exceeded')
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000164 qs = fp.read(clength).decode(encoding)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000165 else:
166 qs = '' # Unknown content-type
Raymond Hettinger54f02222002-06-01 14:18:47 +0000167 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000168 if qs: qs = qs + '&'
169 qs = qs + environ['QUERY_STRING']
Tim Peters88869f92001-01-14 23:36:06 +0000170 elif sys.argv[1:]:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000171 if qs: qs = qs + '&'
172 qs = qs + sys.argv[1]
173 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
Raymond Hettinger54f02222002-06-01 14:18:47 +0000174 elif 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000175 qs = environ['QUERY_STRING']
Guido van Rossum7aee3841996-03-07 18:00:44 +0000176 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000177 if sys.argv[1:]:
178 qs = sys.argv[1]
179 else:
180 qs = ""
181 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000182 return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing,
183 encoding=encoding)
Guido van Rossume7808771995-08-07 20:12:09 +0000184
185
Facundo Batistac469d4c2008-09-03 22:49:01 +0000186# parse query string function called from urlparse,
Martin Panter46f50722016-05-26 05:35:26 +0000187# this is done in order to maintain backward compatibility.
Facundo Batistac469d4c2008-09-03 22:49:01 +0000188
Guido van Rossume08c04c1996-11-11 19:29:11 +0000189def parse_qs(qs, keep_blank_values=0, strict_parsing=0):
Facundo Batistac469d4c2008-09-03 22:49:01 +0000190 """Parse a query given as a string argument."""
191 warn("cgi.parse_qs is deprecated, use urllib.parse.parse_qs instead",
Philip Jenveya394f2d2009-05-08 03:57:12 +0000192 DeprecationWarning, 2)
Facundo Batistac469d4c2008-09-03 22:49:01 +0000193 return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing)
Guido van Rossum1946f0d1999-06-04 17:54:39 +0000194
195def parse_qsl(qs, keep_blank_values=0, strict_parsing=0):
Facundo Batistac469d4c2008-09-03 22:49:01 +0000196 """Parse a query given as a string argument."""
Facundo Batistaa27244b2008-09-09 02:43:19 +0000197 warn("cgi.parse_qsl is deprecated, use urllib.parse.parse_qsl instead",
Philip Jenveya394f2d2009-05-08 03:57:12 +0000198 DeprecationWarning, 2)
Facundo Batistac469d4c2008-09-03 22:49:01 +0000199 return urllib.parse.parse_qsl(qs, keep_blank_values, strict_parsing)
Guido van Rossum9a22de11995-01-12 12:29:47 +0000200
Amber Brown545c9552018-05-14 18:11:55 -0400201def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000202 """Parse multipart input.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000203
Guido van Rossum7aee3841996-03-07 18:00:44 +0000204 Arguments:
205 fp : input file
Johannes Gijsbersc7fc10a2005-01-08 13:56:36 +0000206 pdict: dictionary containing other parameters of content-type header
Amber Brown545c9552018-05-14 18:11:55 -0400207 encoding, errors: request encoding and error handler, passed to
208 FieldStorage
Guido van Rossum72755611996-03-06 07:20:06 +0000209
Tim Peters88869f92001-01-14 23:36:06 +0000210 Returns a dictionary just like parse_qs(): keys are the field names, each
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200211 value is a list of values for that field. For non-file fields, the value
212 is a list of strings.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000213 """
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200214 # RFC 2026, Section 5.1 : The "multipart" boundary delimiters are always
215 # represented as 7bit US-ASCII.
216 boundary = pdict['boundary'].decode('ascii')
217 ctype = "multipart/form-data; boundary={}".format(boundary)
218 headers = Message()
219 headers.set_type(ctype)
220 headers['Content-Length'] = pdict['CONTENT-LENGTH']
Amber Brown545c9552018-05-14 18:11:55 -0400221 fs = FieldStorage(fp, headers=headers, encoding=encoding, errors=errors,
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200222 environ={'REQUEST_METHOD': 'POST'})
223 return {k: fs.getlist(k) for k in fs}
Guido van Rossum9a22de11995-01-12 12:29:47 +0000224
Fred Drake9a0a65b2008-12-04 19:24:50 +0000225def _parseparam(s):
226 while s[:1] == ';':
227 s = s[1:]
228 end = s.find(';')
Senthil Kumaran1ef0c032011-10-20 01:05:44 +0800229 while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2:
Fred Drake9a0a65b2008-12-04 19:24:50 +0000230 end = s.find(';', end + 1)
231 if end < 0:
232 end = len(s)
233 f = s[:end]
234 yield f.strip()
235 s = s[end:]
236
Guido van Rossum72755611996-03-06 07:20:06 +0000237def parse_header(line):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000238 """Parse a Content-type like header.
239
240 Return the main content-type and a dictionary of options.
241
242 """
Fred Drake9a0a65b2008-12-04 19:24:50 +0000243 parts = _parseparam(';' + line)
244 key = parts.__next__()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000245 pdict = {}
Fred Drake9a0a65b2008-12-04 19:24:50 +0000246 for p in parts:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000247 i = p.find('=')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000248 if i >= 0:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000249 name = p[:i].strip().lower()
250 value = p[i+1:].strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000251 if len(value) >= 2 and value[0] == value[-1] == '"':
252 value = value[1:-1]
Johannes Gijsbers9e15dd62004-08-14 15:39:34 +0000253 value = value.replace('\\\\', '\\').replace('\\"', '"')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000254 pdict[name] = value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000255 return key, pdict
Guido van Rossum72755611996-03-06 07:20:06 +0000256
257
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000258# Classes for field storage
259# =========================
260
261class MiniFieldStorage:
262
Guido van Rossum0147db01996-03-09 03:16:04 +0000263 """Like FieldStorage, for use when no file uploads are possible."""
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000264
Guido van Rossum7aee3841996-03-07 18:00:44 +0000265 # Dummy attributes
266 filename = None
267 list = None
268 type = None
Guido van Rossum773ab271996-07-23 03:46:24 +0000269 file = None
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000270 type_options = {}
Guido van Rossum7aee3841996-03-07 18:00:44 +0000271 disposition = None
272 disposition_options = {}
273 headers = {}
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000274
Guido van Rossum7aee3841996-03-07 18:00:44 +0000275 def __init__(self, name, value):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000276 """Constructor from field name and value."""
277 self.name = name
278 self.value = value
Guido van Rossum773ab271996-07-23 03:46:24 +0000279 # self.file = StringIO(value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000280
281 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000282 """Return printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000283 return "MiniFieldStorage(%r, %r)" % (self.name, self.value)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000284
285
286class FieldStorage:
287
Guido van Rossum7aee3841996-03-07 18:00:44 +0000288 """Store a sequence of fields, reading multipart/form-data.
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000289
Guido van Rossum7aee3841996-03-07 18:00:44 +0000290 This class provides naming, typing, files stored on disk, and
291 more. At the top level, it is accessible like a dictionary, whose
292 keys are the field names. (Note: None can occur as a field name.)
293 The items are either a Python list (if there's multiple values) or
294 another FieldStorage or MiniFieldStorage object. If it's a single
295 object, it has the following attributes:
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000296
Guido van Rossum7aee3841996-03-07 18:00:44 +0000297 name: the field name, if specified; otherwise None
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000298
Guido van Rossum7aee3841996-03-07 18:00:44 +0000299 filename: the filename, if specified; otherwise None; this is the
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000300 client side filename, *not* the file name on which it is
301 stored (that's a temporary file you don't deal with)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000302
Guido van Rossum7aee3841996-03-07 18:00:44 +0000303 value: the value as a *string*; for file uploads, this
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000304 transparently reads the file every time you request the value
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000305 and returns *bytes*
Guido van Rossum7aee3841996-03-07 18:00:44 +0000306
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000307 file: the file(-like) object from which you can read the data *as
308 bytes* ; None if the data is stored a simple string
Guido van Rossum7aee3841996-03-07 18:00:44 +0000309
310 type: the content-type, or None if not specified
311
312 type_options: dictionary of options specified on the content-type
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000313 line
Guido van Rossum7aee3841996-03-07 18:00:44 +0000314
315 disposition: content-disposition, or None if not specified
316
317 disposition_options: dictionary of corresponding options
318
Barry Warsaw596097e2008-06-12 02:38:51 +0000319 headers: a dictionary(-like) object (sometimes email.message.Message or a
Armin Rigo3a703b62005-09-19 09:11:04 +0000320 subclass thereof) containing *all* headers
Guido van Rossum7aee3841996-03-07 18:00:44 +0000321
322 The class is subclassable, mostly for the purpose of overriding
323 the make_file() method, which is called internally to come up with
324 a file open for reading and writing. This makes it possible to
325 override the default choice of storing all files in a temporary
326 directory and unlinking them as soon as they have been opened.
327
328 """
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000329 def __init__(self, fp=None, headers=None, outerboundary=b'',
330 environ=os.environ, keep_blank_values=0, strict_parsing=0,
331 limit=None, encoding='utf-8', errors='replace'):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000332 """Constructor. Read multipart/* until last part.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000333
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000334 Arguments, all optional:
Guido van Rossum7aee3841996-03-07 18:00:44 +0000335
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000336 fp : file pointer; default: sys.stdin.buffer
Guido van Rossumb1b4f941998-05-08 19:55:51 +0000337 (not used when the request method is GET)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000338 Can be :
339 1. a TextIOWrapper object
340 2. an object whose read() and readline() methods return bytes
Guido van Rossum7aee3841996-03-07 18:00:44 +0000341
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000342 headers : header dictionary-like object; default:
343 taken from environ as per CGI spec
Guido van Rossum7aee3841996-03-07 18:00:44 +0000344
Guido van Rossum773ab271996-07-23 03:46:24 +0000345 outerboundary : terminating multipart boundary
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000346 (for internal use only)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000347
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000348 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000349
350 keep_blank_values: flag indicating whether blank values in
Senthil Kumaran30e86a42010-08-09 20:01:35 +0000351 percent-encoded forms should be treated as blank strings.
Tim Peters88869f92001-01-14 23:36:06 +0000352 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000353 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000354 blank values are to be ignored and treated as if they were
355 not included.
Guido van Rossum773ab271996-07-23 03:46:24 +0000356
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000357 strict_parsing: flag indicating what to do with parsing errors.
358 If false (the default), errors are silently ignored.
359 If true, errors raise a ValueError exception.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000360
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000361 limit : used internally to read parts of multipart/form-data forms,
362 to exit from the reading loop when reached. It is the difference
363 between the form content-length and the number of bytes already
364 read
365
366 encoding, errors : the encoding and error handler used to decode the
367 binary stream to strings. Must be the same as the charset defined
368 for the page sending the form (content-type : meta http-equiv or
369 header)
370
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000371 """
372 method = 'GET'
373 self.keep_blank_values = keep_blank_values
374 self.strict_parsing = strict_parsing
Raymond Hettinger54f02222002-06-01 14:18:47 +0000375 if 'REQUEST_METHOD' in environ:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000376 method = environ['REQUEST_METHOD'].upper()
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000377 self.qs_on_post = None
Guido van Rossum01852831998-06-25 02:40:17 +0000378 if method == 'GET' or method == 'HEAD':
Raymond Hettinger54f02222002-06-01 14:18:47 +0000379 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000380 qs = environ['QUERY_STRING']
381 elif sys.argv[1:]:
382 qs = sys.argv[1]
383 else:
384 qs = ""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000385 qs = qs.encode(locale.getpreferredencoding(), 'surrogateescape')
386 fp = BytesIO(qs)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000387 if headers is None:
388 headers = {'content-type':
389 "application/x-www-form-urlencoded"}
390 if headers is None:
Guido van Rossumcff311a1998-06-11 14:06:59 +0000391 headers = {}
392 if method == 'POST':
393 # Set default content-type for POST to what's traditional
394 headers['content-type'] = "application/x-www-form-urlencoded"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000395 if 'CONTENT_TYPE' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000396 headers['content-type'] = environ['CONTENT_TYPE']
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000397 if 'QUERY_STRING' in environ:
398 self.qs_on_post = environ['QUERY_STRING']
Raymond Hettinger54f02222002-06-01 14:18:47 +0000399 if 'CONTENT_LENGTH' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000400 headers['content-length'] = environ['CONTENT_LENGTH']
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800401 else:
402 if not (isinstance(headers, (Mapping, Message))):
403 raise TypeError("headers must be mapping or an instance of "
404 "email.message.Message")
405 self.headers = headers
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000406 if fp is None:
407 self.fp = sys.stdin.buffer
408 # self.fp.read() must return bytes
409 elif isinstance(fp, TextIOWrapper):
410 self.fp = fp.buffer
411 else:
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800412 if not (hasattr(fp, 'read') and hasattr(fp, 'readline')):
413 raise TypeError("fp must be file pointer")
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000414 self.fp = fp
415
416 self.encoding = encoding
417 self.errors = errors
418
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000419 if not isinstance(outerboundary, bytes):
420 raise TypeError('outerboundary must be bytes, not %s'
421 % type(outerboundary).__name__)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000422 self.outerboundary = outerboundary
Guido van Rossum7aee3841996-03-07 18:00:44 +0000423
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000424 self.bytes_read = 0
425 self.limit = limit
426
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000427 # Process content-disposition header
428 cdisp, pdict = "", {}
Raymond Hettinger54f02222002-06-01 14:18:47 +0000429 if 'content-disposition' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000430 cdisp, pdict = parse_header(self.headers['content-disposition'])
431 self.disposition = cdisp
432 self.disposition_options = pdict
433 self.name = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000434 if 'name' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000435 self.name = pdict['name']
436 self.filename = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000437 if 'filename' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000438 self.filename = pdict['filename']
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000439 self._binary_file = self.filename is not None
Guido van Rossum7aee3841996-03-07 18:00:44 +0000440
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000441 # Process content-type header
Barry Warsaw302331a1999-01-08 17:42:03 +0000442 #
443 # Honor any existing content-type header. But if there is no
444 # content-type header, use some sensible defaults. Assume
445 # outerboundary is "" at the outer level, but something non-false
446 # inside a multi-part. The default for an inner part is text/plain,
447 # but for an outer part it should be urlencoded. This should catch
448 # bogus clients which erroneously forget to include a content-type
449 # header.
450 #
451 # See below for what we do if there does exist a content-type header,
452 # but it happens to be something we don't understand.
Raymond Hettinger54f02222002-06-01 14:18:47 +0000453 if 'content-type' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000454 ctype, pdict = parse_header(self.headers['content-type'])
Guido van Rossumce900de1999-06-02 18:44:22 +0000455 elif self.outerboundary or method != 'POST':
Barry Warsaw302331a1999-01-08 17:42:03 +0000456 ctype, pdict = "text/plain", {}
457 else:
458 ctype, pdict = 'application/x-www-form-urlencoded', {}
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000459 self.type = ctype
460 self.type_options = pdict
Raymond Hettinger54f02222002-06-01 14:18:47 +0000461 if 'boundary' in pdict:
Amber Brown545c9552018-05-14 18:11:55 -0400462 self.innerboundary = pdict['boundary'].encode(self.encoding,
463 self.errors)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000464 else:
465 self.innerboundary = b""
466
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000467 clen = -1
Raymond Hettinger54f02222002-06-01 14:18:47 +0000468 if 'content-length' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000469 try:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000470 clen = int(self.headers['content-length'])
Skip Montanarodb5d1442002-03-23 05:50:17 +0000471 except ValueError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000472 pass
473 if maxlen and clen > maxlen:
Collin Winterce36ad82007-08-30 01:19:48 +0000474 raise ValueError('Maximum content length exceeded')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000475 self.length = clen
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000476 if self.limit is None and clen:
477 self.limit = clen
Guido van Rossum7aee3841996-03-07 18:00:44 +0000478
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000479 self.list = self.file = None
480 self.done = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000481 if ctype == 'application/x-www-form-urlencoded':
482 self.read_urlencoded()
483 elif ctype[:10] == 'multipart/':
Guido van Rossumf5745001998-10-20 14:43:02 +0000484 self.read_multi(environ, keep_blank_values, strict_parsing)
Barry Warsaw302331a1999-01-08 17:42:03 +0000485 else:
Guido van Rossum60a3bd81999-06-11 18:26:09 +0000486 self.read_single()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000487
Brett Cannonf79126f2013-08-23 15:15:48 -0400488 def __del__(self):
489 try:
490 self.file.close()
491 except AttributeError:
492 pass
493
Berker Peksagbf5e9602015-02-06 10:21:37 +0200494 def __enter__(self):
495 return self
496
497 def __exit__(self, *args):
498 self.file.close()
499
Guido van Rossum7aee3841996-03-07 18:00:44 +0000500 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000501 """Return a printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000502 return "FieldStorage(%r, %r, %r)" % (
503 self.name, self.filename, self.value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000504
Guido van Rossum4061cbe2002-09-11 18:20:34 +0000505 def __iter__(self):
506 return iter(self.keys())
507
Guido van Rossum7aee3841996-03-07 18:00:44 +0000508 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000509 if name != 'value':
Collin Winterce36ad82007-08-30 01:19:48 +0000510 raise AttributeError(name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000511 if self.file:
512 self.file.seek(0)
513 value = self.file.read()
514 self.file.seek(0)
515 elif self.list is not None:
516 value = self.list
517 else:
518 value = None
519 return value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000520
521 def __getitem__(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000522 """Dictionary style indexing."""
523 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000524 raise TypeError("not indexable")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000525 found = []
526 for item in self.list:
527 if item.name == key: found.append(item)
528 if not found:
Collin Winterce36ad82007-08-30 01:19:48 +0000529 raise KeyError(key)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000530 if len(found) == 1:
531 return found[0]
532 else:
533 return found
Guido van Rossum7aee3841996-03-07 18:00:44 +0000534
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000535 def getvalue(self, key, default=None):
536 """Dictionary style get() method, including 'value' lookup."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000537 if key in self:
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000538 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000539 if isinstance(value, list):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000540 return [x.value for x in value]
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000541 else:
542 return value.value
543 else:
544 return default
545
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000546 def getfirst(self, key, default=None):
547 """ Return the first value received."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000548 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000549 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000550 if isinstance(value, list):
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000551 return value[0].value
552 else:
553 return value.value
554 else:
555 return default
556
557 def getlist(self, key):
558 """ Return list of received values."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000559 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000560 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000561 if isinstance(value, list):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000562 return [x.value for x in value]
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000563 else:
564 return [value.value]
565 else:
566 return []
567
Guido van Rossum7aee3841996-03-07 18:00:44 +0000568 def keys(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000569 """Dictionary style keys() method."""
570 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000571 raise TypeError("not indexable")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000572 return list(set(item.name for item in self.list))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000573
Raymond Hettinger54f02222002-06-01 14:18:47 +0000574 def __contains__(self, key):
575 """Dictionary style __contains__ method."""
576 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000577 raise TypeError("not indexable")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000578 return any(item.name == key for item in self.list)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000579
Guido van Rossum88b85d41997-01-11 19:21:33 +0000580 def __len__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000581 """Dictionary style len(x) support."""
582 return len(self.keys())
Guido van Rossum88b85d41997-01-11 19:21:33 +0000583
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800584 def __bool__(self):
585 if self.list is None:
586 raise TypeError("Cannot be converted to bool.")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000587 return bool(self.list)
588
Guido van Rossum7aee3841996-03-07 18:00:44 +0000589 def read_urlencoded(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000590 """Internal: read data in query string format."""
591 qs = self.fp.read(self.length)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000592 if not isinstance(qs, bytes):
593 raise ValueError("%s should return bytes, got %s" \
594 % (self.fp, type(qs).__name__))
595 qs = qs.decode(self.encoding, self.errors)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000596 if self.qs_on_post:
597 qs += '&' + self.qs_on_post
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000598 self.list = []
599 query = urllib.parse.parse_qsl(
600 qs, self.keep_blank_values, self.strict_parsing,
601 encoding=self.encoding, errors=self.errors)
602 for key, value in query:
603 self.list.append(MiniFieldStorage(key, value))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000604 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000605
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000606 FieldStorageClass = None
607
Guido van Rossumf5745001998-10-20 14:43:02 +0000608 def read_multi(self, environ, keep_blank_values, strict_parsing):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000609 """Internal: read a part that is itself multipart."""
Guido van Rossum2e441f72001-07-25 21:00:19 +0000610 ib = self.innerboundary
611 if not valid_boundary(ib):
Collin Winterce36ad82007-08-30 01:19:48 +0000612 raise ValueError('Invalid boundary in multipart form: %r' % (ib,))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000613 self.list = []
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000614 if self.qs_on_post:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000615 query = urllib.parse.parse_qsl(
616 self.qs_on_post, self.keep_blank_values, self.strict_parsing,
617 encoding=self.encoding, errors=self.errors)
618 for key, value in query:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000619 self.list.append(MiniFieldStorage(key, value))
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000620
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000621 klass = self.FieldStorageClass or self.__class__
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000622 first_line = self.fp.readline() # bytes
623 if not isinstance(first_line, bytes):
624 raise ValueError("%s should return bytes, got %s" \
625 % (self.fp, type(first_line).__name__))
626 self.bytes_read += len(first_line)
Donald Stufftd90f8d12015-03-29 16:43:23 -0400627
628 # Ensure that we consume the file until we've hit our inner boundary
629 while (first_line.strip() != (b"--" + self.innerboundary) and
630 first_line):
631 first_line = self.fp.readline()
632 self.bytes_read += len(first_line)
633
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000634 while True:
635 parser = FeedParser()
636 hdr_text = b""
637 while True:
638 data = self.fp.readline()
639 hdr_text += data
640 if not data.strip():
641 break
642 if not hdr_text:
643 break
644 # parser takes strings, not bytes
645 self.bytes_read += len(hdr_text)
646 parser.feed(hdr_text.decode(self.encoding, self.errors))
647 headers = parser.close()
Victor Stinner65794592015-08-18 10:21:10 -0700648
649 # Some clients add Content-Length for part headers, ignore them
650 if 'content-length' in headers:
651 del headers['content-length']
652
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000653 part = klass(self.fp, headers, ib, environ, keep_blank_values,
654 strict_parsing,self.limit-self.bytes_read,
655 self.encoding, self.errors)
656 self.bytes_read += part.bytes_read
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000657 self.list.append(part)
Florent Xicluna331c3fd2013-07-07 12:44:28 +0200658 if part.done or self.bytes_read >= self.length > 0:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000659 break
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000660 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000661
662 def read_single(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000663 """Internal: read an atomic part."""
664 if self.length >= 0:
665 self.read_binary()
666 self.skip_lines()
667 else:
668 self.read_lines()
669 self.file.seek(0)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000670
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000671 bufsize = 8*1024 # I/O buffering size for copy to file
Guido van Rossum7aee3841996-03-07 18:00:44 +0000672
673 def read_binary(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000674 """Internal: read binary data."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000675 self.file = self.make_file()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000676 todo = self.length
677 if todo >= 0:
678 while todo > 0:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000679 data = self.fp.read(min(todo, self.bufsize)) # bytes
680 if not isinstance(data, bytes):
681 raise ValueError("%s should return bytes, got %s"
682 % (self.fp, type(data).__name__))
683 self.bytes_read += len(data)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000684 if not data:
685 self.done = -1
686 break
687 self.file.write(data)
688 todo = todo - len(data)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000689
690 def read_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000691 """Internal: read lines until EOF or outerboundary."""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000692 if self._binary_file:
693 self.file = self.__file = BytesIO() # store data as bytes for files
694 else:
695 self.file = self.__file = StringIO() # as strings for other fields
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000696 if self.outerboundary:
697 self.read_lines_to_outerboundary()
698 else:
699 self.read_lines_to_eof()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000700
Guido van Rossum52b8c292001-06-29 13:06:06 +0000701 def __write(self, line):
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000702 """line is always bytes, not string"""
Guido van Rossum52b8c292001-06-29 13:06:06 +0000703 if self.__file is not None:
704 if self.__file.tell() + len(line) > 1000:
Guido van Rossuma1a68522007-08-28 03:11:34 +0000705 self.file = self.make_file()
706 data = self.__file.getvalue()
707 self.file.write(data)
Guido van Rossum52b8c292001-06-29 13:06:06 +0000708 self.__file = None
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000709 if self._binary_file:
710 # keep bytes
711 self.file.write(line)
712 else:
713 # decode to string
714 self.file.write(line.decode(self.encoding, self.errors))
Guido van Rossum52b8c292001-06-29 13:06:06 +0000715
Guido van Rossum7aee3841996-03-07 18:00:44 +0000716 def read_lines_to_eof(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000717 """Internal: read lines until EOF."""
718 while 1:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000719 line = self.fp.readline(1<<16) # bytes
720 self.bytes_read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000721 if not line:
722 self.done = -1
723 break
Guido van Rossum52b8c292001-06-29 13:06:06 +0000724 self.__write(line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000725
726 def read_lines_to_outerboundary(self):
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000727 """Internal: read lines until outerboundary.
728 Data is read as bytes: boundaries and line ends must be converted
729 to bytes for comparisons.
730 """
731 next_boundary = b"--" + self.outerboundary
732 last_boundary = next_boundary + b"--"
733 delim = b""
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000734 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000735 _read = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000736 while 1:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000737 if _read >= self.limit:
738 break
739 line = self.fp.readline(1<<16) # bytes
740 self.bytes_read += len(line)
741 _read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000742 if not line:
743 self.done = -1
744 break
Serhiy Storchakac7bfe0e2013-06-17 16:34:41 +0300745 if delim == b"\r":
746 line = delim + line
747 delim = b""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000748 if line.startswith(b"--") and last_line_lfend:
749 strippedline = line.rstrip()
750 if strippedline == next_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000751 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000752 if strippedline == last_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000753 self.done = 1
754 break
755 odelim = delim
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000756 if line.endswith(b"\r\n"):
757 delim = b"\r\n"
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000758 line = line[:-2]
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000759 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000760 elif line.endswith(b"\n"):
761 delim = b"\n"
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000762 line = line[:-1]
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000763 last_line_lfend = True
Serhiy Storchakac7bfe0e2013-06-17 16:34:41 +0300764 elif line.endswith(b"\r"):
765 # We may interrupt \r\n sequences if they span the 2**16
766 # byte boundary
767 delim = b"\r"
768 line = line[:-1]
769 last_line_lfend = False
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000770 else:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000771 delim = b""
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000772 last_line_lfend = False
Guido van Rossum52b8c292001-06-29 13:06:06 +0000773 self.__write(odelim + line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000774
775 def skip_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000776 """Internal: skip lines until outer boundary if defined."""
777 if not self.outerboundary or self.done:
778 return
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000779 next_boundary = b"--" + self.outerboundary
780 last_boundary = next_boundary + b"--"
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000781 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000782 while True:
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000783 line = self.fp.readline(1<<16)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000784 self.bytes_read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000785 if not line:
786 self.done = -1
787 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000788 if line.endswith(b"--") and last_line_lfend:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000789 strippedline = line.strip()
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000790 if strippedline == next_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000791 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000792 if strippedline == last_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000793 self.done = 1
794 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000795 last_line_lfend = line.endswith(b'\n')
Guido van Rossum7aee3841996-03-07 18:00:44 +0000796
Guido van Rossuma1a68522007-08-28 03:11:34 +0000797 def make_file(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000798 """Overridable: return a readable & writable file.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000799
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000800 The file will be used as follows:
801 - data is written to it
802 - seek(0)
803 - data is read from it
Guido van Rossum7aee3841996-03-07 18:00:44 +0000804
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000805 The file is opened in binary mode for files, in text mode
806 for other fields
Guido van Rossum7aee3841996-03-07 18:00:44 +0000807
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000808 This version opens a temporary file for reading and writing,
809 and immediately deletes (unlinks) it. The trick (on Unix!) is
810 that the file can still be used, but it can't be opened by
811 another process, and it will automatically be deleted when it
812 is closed or when the current process terminates.
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000813
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000814 If you want a more permanent file, you derive a class which
815 overrides this method. If you want a visible temporary file
816 that is nevertheless automatically deleted when the script
817 terminates, try defining a __del__ method in a derived class
818 which unlinks the temporary files you have created.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000819
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000820 """
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000821 if self._binary_file:
822 return tempfile.TemporaryFile("wb+")
823 else:
824 return tempfile.TemporaryFile("w+",
825 encoding=self.encoding, newline = '\n')
Tim Peters88869f92001-01-14 23:36:06 +0000826
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000827
Guido van Rossum72755611996-03-06 07:20:06 +0000828# Test/debug code
829# ===============
Guido van Rossum9a22de11995-01-12 12:29:47 +0000830
Guido van Rossum773ab271996-07-23 03:46:24 +0000831def test(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000832 """Robust test CGI script, usable as main program.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000833
Guido van Rossum7aee3841996-03-07 18:00:44 +0000834 Write minimal HTTP headers and dump all information provided to
835 the script in HTML form.
836
837 """
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000838 print("Content-type: text/html")
839 print()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000840 sys.stderr = sys.stdout
841 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000842 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000843 print_directory()
844 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000845 print_form(form)
846 print_environ(environ)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000847 print_environ_usage()
848 def f():
Georg Brandl7cae87c2006-09-06 06:51:57 +0000849 exec("testing print_exception() -- <I>italics?</I>")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000850 def g(f=f):
851 f()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000852 print("<H3>What follows is a test, not an actual exception:</H3>")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000853 g()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000854 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000855 print_exception()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000856
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000857 print("<H1>Second try with a small maxlen...</H1>")
Guido van Rossum57d51f22000-09-16 21:16:01 +0000858
Guido van Rossumad164711997-05-13 19:03:23 +0000859 global maxlen
860 maxlen = 50
861 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000862 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000863 print_directory()
864 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000865 print_form(form)
866 print_environ(environ)
Guido van Rossumad164711997-05-13 19:03:23 +0000867 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000868 print_exception()
Guido van Rossumad164711997-05-13 19:03:23 +0000869
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000870def print_exception(type=None, value=None, tb=None, limit=None):
871 if type is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000872 type, value, tb = sys.exc_info()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000873 import traceback
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000874 print()
875 print("<H3>Traceback (most recent call last):</H3>")
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000876 list = traceback.format_tb(tb, limit) + \
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000877 traceback.format_exception_only(type, value)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000878 print("<PRE>%s<B>%s</B></PRE>" % (
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000879 html.escape("".join(list[:-1])),
880 html.escape(list[-1]),
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000881 ))
Guido van Rossumf15d1591997-09-29 23:22:12 +0000882 del tb
Guido van Rossum9a22de11995-01-12 12:29:47 +0000883
Guido van Rossum773ab271996-07-23 03:46:24 +0000884def print_environ(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000885 """Dump the shell environment as HTML."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000886 keys = sorted(environ.keys())
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000887 print()
888 print("<H3>Shell Environment:</H3>")
889 print("<DL>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000890 for key in keys:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000891 print("<DT>", html.escape(key), "<DD>", html.escape(environ[key]))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000892 print("</DL>")
893 print()
Guido van Rossum72755611996-03-06 07:20:06 +0000894
895def print_form(form):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000896 """Dump the contents of a form as HTML."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000897 keys = sorted(form.keys())
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000898 print()
899 print("<H3>Form Contents:</H3>")
Guido van Rossum57d51f22000-09-16 21:16:01 +0000900 if not keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000901 print("<P>No form fields.")
902 print("<DL>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000903 for key in keys:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000904 print("<DT>" + html.escape(key) + ":", end=' ')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000905 value = form[key]
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000906 print("<i>" + html.escape(repr(type(value))) + "</i>")
907 print("<DD>" + html.escape(repr(value)))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000908 print("</DL>")
909 print()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000910
911def print_directory():
912 """Dump the current directory as HTML."""
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000913 print()
914 print("<H3>Current Working Directory:</H3>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000915 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000916 pwd = os.getcwd()
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200917 except OSError as msg:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200918 print("OSError:", html.escape(str(msg)))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000919 else:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000920 print(html.escape(pwd))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000921 print()
Guido van Rossum9a22de11995-01-12 12:29:47 +0000922
Guido van Rossuma8738a51996-03-14 21:30:28 +0000923def print_arguments():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000924 print()
925 print("<H3>Command Line Arguments:</H3>")
926 print()
927 print(sys.argv)
928 print()
Guido van Rossuma8738a51996-03-14 21:30:28 +0000929
Guido van Rossum9a22de11995-01-12 12:29:47 +0000930def print_environ_usage():
Guido van Rossum7aee3841996-03-07 18:00:44 +0000931 """Dump a list of environment variables used by CGI as HTML."""
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000932 print("""
Guido van Rossum72755611996-03-06 07:20:06 +0000933<H3>These environment variables could have been set:</H3>
934<UL>
Guido van Rossum9a22de11995-01-12 12:29:47 +0000935<LI>AUTH_TYPE
936<LI>CONTENT_LENGTH
937<LI>CONTENT_TYPE
938<LI>DATE_GMT
939<LI>DATE_LOCAL
940<LI>DOCUMENT_NAME
941<LI>DOCUMENT_ROOT
942<LI>DOCUMENT_URI
943<LI>GATEWAY_INTERFACE
944<LI>LAST_MODIFIED
945<LI>PATH
946<LI>PATH_INFO
947<LI>PATH_TRANSLATED
948<LI>QUERY_STRING
949<LI>REMOTE_ADDR
950<LI>REMOTE_HOST
951<LI>REMOTE_IDENT
952<LI>REMOTE_USER
953<LI>REQUEST_METHOD
954<LI>SCRIPT_NAME
955<LI>SERVER_NAME
956<LI>SERVER_PORT
957<LI>SERVER_PROTOCOL
958<LI>SERVER_ROOT
959<LI>SERVER_SOFTWARE
960</UL>
Guido van Rossum7aee3841996-03-07 18:00:44 +0000961In addition, HTTP headers sent by the server may be passed in the
962environment as well. Here are some common variable names:
963<UL>
964<LI>HTTP_ACCEPT
965<LI>HTTP_CONNECTION
966<LI>HTTP_HOST
967<LI>HTTP_PRAGMA
968<LI>HTTP_REFERER
969<LI>HTTP_USER_AGENT
970</UL>
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000971""")
Guido van Rossum9a22de11995-01-12 12:29:47 +0000972
Guido van Rossum9a22de11995-01-12 12:29:47 +0000973
Guido van Rossum72755611996-03-06 07:20:06 +0000974# Utilities
975# =========
Guido van Rossum9a22de11995-01-12 12:29:47 +0000976
Guido van Rossum64c66201997-07-19 20:11:53 +0000977def escape(s, quote=None):
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000978 """Deprecated API."""
979 warn("cgi.escape is deprecated, use html.escape instead",
Florent Xicluna67317752011-12-10 11:07:42 +0100980 DeprecationWarning, stacklevel=2)
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000981 s = s.replace("&", "&amp;") # Must be done first!
982 s = s.replace("<", "&lt;")
983 s = s.replace(">", "&gt;")
Guido van Rossum64c66201997-07-19 20:11:53 +0000984 if quote:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000985 s = s.replace('"', "&quot;")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000986 return s
Guido van Rossum9a22de11995-01-12 12:29:47 +0000987
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000988
Benjamin Peterson4d59a782014-04-03 10:22:10 -0400989def valid_boundary(s):
Guido van Rossum2e441f72001-07-25 21:00:19 +0000990 import re
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000991 if isinstance(s, bytes):
992 _vb_pattern = b"^[ -~]{0,200}[!-~]$"
993 else:
994 _vb_pattern = "^[ -~]{0,200}[!-~]$"
Guido van Rossum2e441f72001-07-25 21:00:19 +0000995 return re.match(_vb_pattern, s)
Guido van Rossum9a22de11995-01-12 12:29:47 +0000996
Guido van Rossum72755611996-03-06 07:20:06 +0000997# Invoke mainline
998# ===============
999
1000# Call test() when this file is run as a script (not imported as a module)
Tim Peters88869f92001-01-14 23:36:06 +00001001if __name__ == '__main__':
Guido van Rossum7aee3841996-03-07 18:00:44 +00001002 test()