blob: f5e85aa263b927bd587242d12d2d50b434179f40 [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
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200201def parse_multipart(fp, pdict, encoding="utf-8"):
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
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200207 encoding: request encoding
Guido van Rossum72755611996-03-06 07:20:06 +0000208
Tim Peters88869f92001-01-14 23:36:06 +0000209 Returns a dictionary just like parse_qs(): keys are the field names, each
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200210 value is a list of values for that field. For non-file fields, the value
211 is a list of strings.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000212 """
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200213 # RFC 2026, Section 5.1 : The "multipart" boundary delimiters are always
214 # represented as 7bit US-ASCII.
215 boundary = pdict['boundary'].decode('ascii')
216 ctype = "multipart/form-data; boundary={}".format(boundary)
217 headers = Message()
218 headers.set_type(ctype)
219 headers['Content-Length'] = pdict['CONTENT-LENGTH']
220 fs = FieldStorage(fp, headers=headers, encoding=encoding,
221 environ={'REQUEST_METHOD': 'POST'})
222 return {k: fs.getlist(k) for k in fs}
Guido van Rossum9a22de11995-01-12 12:29:47 +0000223
Fred Drake9a0a65b2008-12-04 19:24:50 +0000224def _parseparam(s):
225 while s[:1] == ';':
226 s = s[1:]
227 end = s.find(';')
Senthil Kumaran1ef0c032011-10-20 01:05:44 +0800228 while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2:
Fred Drake9a0a65b2008-12-04 19:24:50 +0000229 end = s.find(';', end + 1)
230 if end < 0:
231 end = len(s)
232 f = s[:end]
233 yield f.strip()
234 s = s[end:]
235
Guido van Rossum72755611996-03-06 07:20:06 +0000236def parse_header(line):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000237 """Parse a Content-type like header.
238
239 Return the main content-type and a dictionary of options.
240
241 """
Fred Drake9a0a65b2008-12-04 19:24:50 +0000242 parts = _parseparam(';' + line)
243 key = parts.__next__()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000244 pdict = {}
Fred Drake9a0a65b2008-12-04 19:24:50 +0000245 for p in parts:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000246 i = p.find('=')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000247 if i >= 0:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000248 name = p[:i].strip().lower()
249 value = p[i+1:].strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000250 if len(value) >= 2 and value[0] == value[-1] == '"':
251 value = value[1:-1]
Johannes Gijsbers9e15dd62004-08-14 15:39:34 +0000252 value = value.replace('\\\\', '\\').replace('\\"', '"')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000253 pdict[name] = value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000254 return key, pdict
Guido van Rossum72755611996-03-06 07:20:06 +0000255
256
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000257# Classes for field storage
258# =========================
259
260class MiniFieldStorage:
261
Guido van Rossum0147db01996-03-09 03:16:04 +0000262 """Like FieldStorage, for use when no file uploads are possible."""
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000263
Guido van Rossum7aee3841996-03-07 18:00:44 +0000264 # Dummy attributes
265 filename = None
266 list = None
267 type = None
Guido van Rossum773ab271996-07-23 03:46:24 +0000268 file = None
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000269 type_options = {}
Guido van Rossum7aee3841996-03-07 18:00:44 +0000270 disposition = None
271 disposition_options = {}
272 headers = {}
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000273
Guido van Rossum7aee3841996-03-07 18:00:44 +0000274 def __init__(self, name, value):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000275 """Constructor from field name and value."""
276 self.name = name
277 self.value = value
Guido van Rossum773ab271996-07-23 03:46:24 +0000278 # self.file = StringIO(value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000279
280 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000281 """Return printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000282 return "MiniFieldStorage(%r, %r)" % (self.name, self.value)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000283
284
285class FieldStorage:
286
Guido van Rossum7aee3841996-03-07 18:00:44 +0000287 """Store a sequence of fields, reading multipart/form-data.
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000288
Guido van Rossum7aee3841996-03-07 18:00:44 +0000289 This class provides naming, typing, files stored on disk, and
290 more. At the top level, it is accessible like a dictionary, whose
291 keys are the field names. (Note: None can occur as a field name.)
292 The items are either a Python list (if there's multiple values) or
293 another FieldStorage or MiniFieldStorage object. If it's a single
294 object, it has the following attributes:
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000295
Guido van Rossum7aee3841996-03-07 18:00:44 +0000296 name: the field name, if specified; otherwise None
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000297
Guido van Rossum7aee3841996-03-07 18:00:44 +0000298 filename: the filename, if specified; otherwise None; this is the
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000299 client side filename, *not* the file name on which it is
300 stored (that's a temporary file you don't deal with)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000301
Guido van Rossum7aee3841996-03-07 18:00:44 +0000302 value: the value as a *string*; for file uploads, this
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000303 transparently reads the file every time you request the value
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000304 and returns *bytes*
Guido van Rossum7aee3841996-03-07 18:00:44 +0000305
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000306 file: the file(-like) object from which you can read the data *as
307 bytes* ; None if the data is stored a simple string
Guido van Rossum7aee3841996-03-07 18:00:44 +0000308
309 type: the content-type, or None if not specified
310
311 type_options: dictionary of options specified on the content-type
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000312 line
Guido van Rossum7aee3841996-03-07 18:00:44 +0000313
314 disposition: content-disposition, or None if not specified
315
316 disposition_options: dictionary of corresponding options
317
Barry Warsaw596097e2008-06-12 02:38:51 +0000318 headers: a dictionary(-like) object (sometimes email.message.Message or a
Armin Rigo3a703b62005-09-19 09:11:04 +0000319 subclass thereof) containing *all* headers
Guido van Rossum7aee3841996-03-07 18:00:44 +0000320
321 The class is subclassable, mostly for the purpose of overriding
322 the make_file() method, which is called internally to come up with
323 a file open for reading and writing. This makes it possible to
324 override the default choice of storing all files in a temporary
325 directory and unlinking them as soon as they have been opened.
326
327 """
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000328 def __init__(self, fp=None, headers=None, outerboundary=b'',
329 environ=os.environ, keep_blank_values=0, strict_parsing=0,
330 limit=None, encoding='utf-8', errors='replace'):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000331 """Constructor. Read multipart/* until last part.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000332
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000333 Arguments, all optional:
Guido van Rossum7aee3841996-03-07 18:00:44 +0000334
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000335 fp : file pointer; default: sys.stdin.buffer
Guido van Rossumb1b4f941998-05-08 19:55:51 +0000336 (not used when the request method is GET)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000337 Can be :
338 1. a TextIOWrapper object
339 2. an object whose read() and readline() methods return bytes
Guido van Rossum7aee3841996-03-07 18:00:44 +0000340
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000341 headers : header dictionary-like object; default:
342 taken from environ as per CGI spec
Guido van Rossum7aee3841996-03-07 18:00:44 +0000343
Guido van Rossum773ab271996-07-23 03:46:24 +0000344 outerboundary : terminating multipart boundary
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000345 (for internal use only)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000346
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000347 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000348
349 keep_blank_values: flag indicating whether blank values in
Senthil Kumaran30e86a42010-08-09 20:01:35 +0000350 percent-encoded forms should be treated as blank strings.
Tim Peters88869f92001-01-14 23:36:06 +0000351 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000352 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000353 blank values are to be ignored and treated as if they were
354 not included.
Guido van Rossum773ab271996-07-23 03:46:24 +0000355
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000356 strict_parsing: flag indicating what to do with parsing errors.
357 If false (the default), errors are silently ignored.
358 If true, errors raise a ValueError exception.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000359
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000360 limit : used internally to read parts of multipart/form-data forms,
361 to exit from the reading loop when reached. It is the difference
362 between the form content-length and the number of bytes already
363 read
364
365 encoding, errors : the encoding and error handler used to decode the
366 binary stream to strings. Must be the same as the charset defined
367 for the page sending the form (content-type : meta http-equiv or
368 header)
369
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000370 """
371 method = 'GET'
372 self.keep_blank_values = keep_blank_values
373 self.strict_parsing = strict_parsing
Raymond Hettinger54f02222002-06-01 14:18:47 +0000374 if 'REQUEST_METHOD' in environ:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000375 method = environ['REQUEST_METHOD'].upper()
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000376 self.qs_on_post = None
Guido van Rossum01852831998-06-25 02:40:17 +0000377 if method == 'GET' or method == 'HEAD':
Raymond Hettinger54f02222002-06-01 14:18:47 +0000378 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000379 qs = environ['QUERY_STRING']
380 elif sys.argv[1:]:
381 qs = sys.argv[1]
382 else:
383 qs = ""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000384 qs = qs.encode(locale.getpreferredencoding(), 'surrogateescape')
385 fp = BytesIO(qs)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000386 if headers is None:
387 headers = {'content-type':
388 "application/x-www-form-urlencoded"}
389 if headers is None:
Guido van Rossumcff311a1998-06-11 14:06:59 +0000390 headers = {}
391 if method == 'POST':
392 # Set default content-type for POST to what's traditional
393 headers['content-type'] = "application/x-www-form-urlencoded"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000394 if 'CONTENT_TYPE' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000395 headers['content-type'] = environ['CONTENT_TYPE']
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000396 if 'QUERY_STRING' in environ:
397 self.qs_on_post = environ['QUERY_STRING']
Raymond Hettinger54f02222002-06-01 14:18:47 +0000398 if 'CONTENT_LENGTH' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000399 headers['content-length'] = environ['CONTENT_LENGTH']
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800400 else:
401 if not (isinstance(headers, (Mapping, Message))):
402 raise TypeError("headers must be mapping or an instance of "
403 "email.message.Message")
404 self.headers = headers
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000405 if fp is None:
406 self.fp = sys.stdin.buffer
407 # self.fp.read() must return bytes
408 elif isinstance(fp, TextIOWrapper):
409 self.fp = fp.buffer
410 else:
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800411 if not (hasattr(fp, 'read') and hasattr(fp, 'readline')):
412 raise TypeError("fp must be file pointer")
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000413 self.fp = fp
414
415 self.encoding = encoding
416 self.errors = errors
417
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000418 if not isinstance(outerboundary, bytes):
419 raise TypeError('outerboundary must be bytes, not %s'
420 % type(outerboundary).__name__)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000421 self.outerboundary = outerboundary
Guido van Rossum7aee3841996-03-07 18:00:44 +0000422
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000423 self.bytes_read = 0
424 self.limit = limit
425
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000426 # Process content-disposition header
427 cdisp, pdict = "", {}
Raymond Hettinger54f02222002-06-01 14:18:47 +0000428 if 'content-disposition' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000429 cdisp, pdict = parse_header(self.headers['content-disposition'])
430 self.disposition = cdisp
431 self.disposition_options = pdict
432 self.name = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000433 if 'name' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000434 self.name = pdict['name']
435 self.filename = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000436 if 'filename' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000437 self.filename = pdict['filename']
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000438 self._binary_file = self.filename is not None
Guido van Rossum7aee3841996-03-07 18:00:44 +0000439
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000440 # Process content-type header
Barry Warsaw302331a1999-01-08 17:42:03 +0000441 #
442 # Honor any existing content-type header. But if there is no
443 # content-type header, use some sensible defaults. Assume
444 # outerboundary is "" at the outer level, but something non-false
445 # inside a multi-part. The default for an inner part is text/plain,
446 # but for an outer part it should be urlencoded. This should catch
447 # bogus clients which erroneously forget to include a content-type
448 # header.
449 #
450 # See below for what we do if there does exist a content-type header,
451 # but it happens to be something we don't understand.
Raymond Hettinger54f02222002-06-01 14:18:47 +0000452 if 'content-type' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000453 ctype, pdict = parse_header(self.headers['content-type'])
Guido van Rossumce900de1999-06-02 18:44:22 +0000454 elif self.outerboundary or method != 'POST':
Barry Warsaw302331a1999-01-08 17:42:03 +0000455 ctype, pdict = "text/plain", {}
456 else:
457 ctype, pdict = 'application/x-www-form-urlencoded', {}
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000458 self.type = ctype
459 self.type_options = pdict
Raymond Hettinger54f02222002-06-01 14:18:47 +0000460 if 'boundary' in pdict:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000461 self.innerboundary = pdict['boundary'].encode(self.encoding)
462 else:
463 self.innerboundary = b""
464
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000465 clen = -1
Raymond Hettinger54f02222002-06-01 14:18:47 +0000466 if 'content-length' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000467 try:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000468 clen = int(self.headers['content-length'])
Skip Montanarodb5d1442002-03-23 05:50:17 +0000469 except ValueError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000470 pass
471 if maxlen and clen > maxlen:
Collin Winterce36ad82007-08-30 01:19:48 +0000472 raise ValueError('Maximum content length exceeded')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000473 self.length = clen
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000474 if self.limit is None and clen:
475 self.limit = clen
Guido van Rossum7aee3841996-03-07 18:00:44 +0000476
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000477 self.list = self.file = None
478 self.done = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000479 if ctype == 'application/x-www-form-urlencoded':
480 self.read_urlencoded()
481 elif ctype[:10] == 'multipart/':
Guido van Rossumf5745001998-10-20 14:43:02 +0000482 self.read_multi(environ, keep_blank_values, strict_parsing)
Barry Warsaw302331a1999-01-08 17:42:03 +0000483 else:
Guido van Rossum60a3bd81999-06-11 18:26:09 +0000484 self.read_single()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000485
Brett Cannonf79126f2013-08-23 15:15:48 -0400486 def __del__(self):
487 try:
488 self.file.close()
489 except AttributeError:
490 pass
491
Berker Peksagbf5e9602015-02-06 10:21:37 +0200492 def __enter__(self):
493 return self
494
495 def __exit__(self, *args):
496 self.file.close()
497
Guido van Rossum7aee3841996-03-07 18:00:44 +0000498 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000499 """Return a printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000500 return "FieldStorage(%r, %r, %r)" % (
501 self.name, self.filename, self.value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000502
Guido van Rossum4061cbe2002-09-11 18:20:34 +0000503 def __iter__(self):
504 return iter(self.keys())
505
Guido van Rossum7aee3841996-03-07 18:00:44 +0000506 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000507 if name != 'value':
Collin Winterce36ad82007-08-30 01:19:48 +0000508 raise AttributeError(name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000509 if self.file:
510 self.file.seek(0)
511 value = self.file.read()
512 self.file.seek(0)
513 elif self.list is not None:
514 value = self.list
515 else:
516 value = None
517 return value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000518
519 def __getitem__(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000520 """Dictionary style indexing."""
521 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000522 raise TypeError("not indexable")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000523 found = []
524 for item in self.list:
525 if item.name == key: found.append(item)
526 if not found:
Collin Winterce36ad82007-08-30 01:19:48 +0000527 raise KeyError(key)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000528 if len(found) == 1:
529 return found[0]
530 else:
531 return found
Guido van Rossum7aee3841996-03-07 18:00:44 +0000532
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000533 def getvalue(self, key, default=None):
534 """Dictionary style get() method, including 'value' lookup."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000535 if key in self:
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000536 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000537 if isinstance(value, list):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000538 return [x.value for x in value]
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000539 else:
540 return value.value
541 else:
542 return default
543
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000544 def getfirst(self, key, default=None):
545 """ Return the first value received."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000546 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000547 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000548 if isinstance(value, list):
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000549 return value[0].value
550 else:
551 return value.value
552 else:
553 return default
554
555 def getlist(self, key):
556 """ Return list of received values."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000557 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000558 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000559 if isinstance(value, list):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000560 return [x.value for x in value]
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000561 else:
562 return [value.value]
563 else:
564 return []
565
Guido van Rossum7aee3841996-03-07 18:00:44 +0000566 def keys(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000567 """Dictionary style keys() method."""
568 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000569 raise TypeError("not indexable")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000570 return list(set(item.name for item in self.list))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000571
Raymond Hettinger54f02222002-06-01 14:18:47 +0000572 def __contains__(self, key):
573 """Dictionary style __contains__ method."""
574 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000575 raise TypeError("not indexable")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000576 return any(item.name == key for item in self.list)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000577
Guido van Rossum88b85d41997-01-11 19:21:33 +0000578 def __len__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000579 """Dictionary style len(x) support."""
580 return len(self.keys())
Guido van Rossum88b85d41997-01-11 19:21:33 +0000581
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800582 def __bool__(self):
583 if self.list is None:
584 raise TypeError("Cannot be converted to bool.")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000585 return bool(self.list)
586
Guido van Rossum7aee3841996-03-07 18:00:44 +0000587 def read_urlencoded(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000588 """Internal: read data in query string format."""
589 qs = self.fp.read(self.length)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000590 if not isinstance(qs, bytes):
591 raise ValueError("%s should return bytes, got %s" \
592 % (self.fp, type(qs).__name__))
593 qs = qs.decode(self.encoding, self.errors)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000594 if self.qs_on_post:
595 qs += '&' + self.qs_on_post
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000596 self.list = []
597 query = urllib.parse.parse_qsl(
598 qs, self.keep_blank_values, self.strict_parsing,
599 encoding=self.encoding, errors=self.errors)
600 for key, value in query:
601 self.list.append(MiniFieldStorage(key, value))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000602 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000603
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000604 FieldStorageClass = None
605
Guido van Rossumf5745001998-10-20 14:43:02 +0000606 def read_multi(self, environ, keep_blank_values, strict_parsing):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000607 """Internal: read a part that is itself multipart."""
Guido van Rossum2e441f72001-07-25 21:00:19 +0000608 ib = self.innerboundary
609 if not valid_boundary(ib):
Collin Winterce36ad82007-08-30 01:19:48 +0000610 raise ValueError('Invalid boundary in multipart form: %r' % (ib,))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000611 self.list = []
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000612 if self.qs_on_post:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000613 query = urllib.parse.parse_qsl(
614 self.qs_on_post, self.keep_blank_values, self.strict_parsing,
615 encoding=self.encoding, errors=self.errors)
616 for key, value in query:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000617 self.list.append(MiniFieldStorage(key, value))
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000618
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000619 klass = self.FieldStorageClass or self.__class__
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000620 first_line = self.fp.readline() # bytes
621 if not isinstance(first_line, bytes):
622 raise ValueError("%s should return bytes, got %s" \
623 % (self.fp, type(first_line).__name__))
624 self.bytes_read += len(first_line)
Donald Stufftd90f8d12015-03-29 16:43:23 -0400625
626 # Ensure that we consume the file until we've hit our inner boundary
627 while (first_line.strip() != (b"--" + self.innerboundary) and
628 first_line):
629 first_line = self.fp.readline()
630 self.bytes_read += len(first_line)
631
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000632 while True:
633 parser = FeedParser()
634 hdr_text = b""
635 while True:
636 data = self.fp.readline()
637 hdr_text += data
638 if not data.strip():
639 break
640 if not hdr_text:
641 break
642 # parser takes strings, not bytes
643 self.bytes_read += len(hdr_text)
644 parser.feed(hdr_text.decode(self.encoding, self.errors))
645 headers = parser.close()
Victor Stinner65794592015-08-18 10:21:10 -0700646
647 # Some clients add Content-Length for part headers, ignore them
648 if 'content-length' in headers:
649 del headers['content-length']
650
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000651 part = klass(self.fp, headers, ib, environ, keep_blank_values,
652 strict_parsing,self.limit-self.bytes_read,
653 self.encoding, self.errors)
654 self.bytes_read += part.bytes_read
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000655 self.list.append(part)
Florent Xicluna331c3fd2013-07-07 12:44:28 +0200656 if part.done or self.bytes_read >= self.length > 0:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000657 break
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000658 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000659
660 def read_single(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000661 """Internal: read an atomic part."""
662 if self.length >= 0:
663 self.read_binary()
664 self.skip_lines()
665 else:
666 self.read_lines()
667 self.file.seek(0)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000668
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000669 bufsize = 8*1024 # I/O buffering size for copy to file
Guido van Rossum7aee3841996-03-07 18:00:44 +0000670
671 def read_binary(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000672 """Internal: read binary data."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000673 self.file = self.make_file()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000674 todo = self.length
675 if todo >= 0:
676 while todo > 0:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000677 data = self.fp.read(min(todo, self.bufsize)) # bytes
678 if not isinstance(data, bytes):
679 raise ValueError("%s should return bytes, got %s"
680 % (self.fp, type(data).__name__))
681 self.bytes_read += len(data)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000682 if not data:
683 self.done = -1
684 break
685 self.file.write(data)
686 todo = todo - len(data)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000687
688 def read_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000689 """Internal: read lines until EOF or outerboundary."""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000690 if self._binary_file:
691 self.file = self.__file = BytesIO() # store data as bytes for files
692 else:
693 self.file = self.__file = StringIO() # as strings for other fields
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000694 if self.outerboundary:
695 self.read_lines_to_outerboundary()
696 else:
697 self.read_lines_to_eof()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000698
Guido van Rossum52b8c292001-06-29 13:06:06 +0000699 def __write(self, line):
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000700 """line is always bytes, not string"""
Guido van Rossum52b8c292001-06-29 13:06:06 +0000701 if self.__file is not None:
702 if self.__file.tell() + len(line) > 1000:
Guido van Rossuma1a68522007-08-28 03:11:34 +0000703 self.file = self.make_file()
704 data = self.__file.getvalue()
705 self.file.write(data)
Guido van Rossum52b8c292001-06-29 13:06:06 +0000706 self.__file = None
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000707 if self._binary_file:
708 # keep bytes
709 self.file.write(line)
710 else:
711 # decode to string
712 self.file.write(line.decode(self.encoding, self.errors))
Guido van Rossum52b8c292001-06-29 13:06:06 +0000713
Guido van Rossum7aee3841996-03-07 18:00:44 +0000714 def read_lines_to_eof(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000715 """Internal: read lines until EOF."""
716 while 1:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000717 line = self.fp.readline(1<<16) # bytes
718 self.bytes_read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000719 if not line:
720 self.done = -1
721 break
Guido van Rossum52b8c292001-06-29 13:06:06 +0000722 self.__write(line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000723
724 def read_lines_to_outerboundary(self):
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000725 """Internal: read lines until outerboundary.
726 Data is read as bytes: boundaries and line ends must be converted
727 to bytes for comparisons.
728 """
729 next_boundary = b"--" + self.outerboundary
730 last_boundary = next_boundary + b"--"
731 delim = b""
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000732 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000733 _read = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000734 while 1:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000735 if _read >= self.limit:
736 break
737 line = self.fp.readline(1<<16) # bytes
738 self.bytes_read += len(line)
739 _read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000740 if not line:
741 self.done = -1
742 break
Serhiy Storchakac7bfe0e2013-06-17 16:34:41 +0300743 if delim == b"\r":
744 line = delim + line
745 delim = b""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000746 if line.startswith(b"--") and last_line_lfend:
747 strippedline = line.rstrip()
748 if strippedline == next_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000749 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000750 if strippedline == last_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000751 self.done = 1
752 break
753 odelim = delim
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000754 if line.endswith(b"\r\n"):
755 delim = b"\r\n"
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000756 line = line[:-2]
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000757 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000758 elif line.endswith(b"\n"):
759 delim = b"\n"
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000760 line = line[:-1]
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000761 last_line_lfend = True
Serhiy Storchakac7bfe0e2013-06-17 16:34:41 +0300762 elif line.endswith(b"\r"):
763 # We may interrupt \r\n sequences if they span the 2**16
764 # byte boundary
765 delim = b"\r"
766 line = line[:-1]
767 last_line_lfend = False
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000768 else:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000769 delim = b""
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000770 last_line_lfend = False
Guido van Rossum52b8c292001-06-29 13:06:06 +0000771 self.__write(odelim + line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000772
773 def skip_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000774 """Internal: skip lines until outer boundary if defined."""
775 if not self.outerboundary or self.done:
776 return
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000777 next_boundary = b"--" + self.outerboundary
778 last_boundary = next_boundary + b"--"
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000779 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000780 while True:
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000781 line = self.fp.readline(1<<16)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000782 self.bytes_read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000783 if not line:
784 self.done = -1
785 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000786 if line.endswith(b"--") and last_line_lfend:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000787 strippedline = line.strip()
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000788 if strippedline == next_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000789 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000790 if strippedline == last_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000791 self.done = 1
792 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000793 last_line_lfend = line.endswith(b'\n')
Guido van Rossum7aee3841996-03-07 18:00:44 +0000794
Guido van Rossuma1a68522007-08-28 03:11:34 +0000795 def make_file(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000796 """Overridable: return a readable & writable file.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000797
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000798 The file will be used as follows:
799 - data is written to it
800 - seek(0)
801 - data is read from it
Guido van Rossum7aee3841996-03-07 18:00:44 +0000802
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000803 The file is opened in binary mode for files, in text mode
804 for other fields
Guido van Rossum7aee3841996-03-07 18:00:44 +0000805
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000806 This version opens a temporary file for reading and writing,
807 and immediately deletes (unlinks) it. The trick (on Unix!) is
808 that the file can still be used, but it can't be opened by
809 another process, and it will automatically be deleted when it
810 is closed or when the current process terminates.
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000811
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000812 If you want a more permanent file, you derive a class which
813 overrides this method. If you want a visible temporary file
814 that is nevertheless automatically deleted when the script
815 terminates, try defining a __del__ method in a derived class
816 which unlinks the temporary files you have created.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000817
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000818 """
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000819 if self._binary_file:
820 return tempfile.TemporaryFile("wb+")
821 else:
822 return tempfile.TemporaryFile("w+",
823 encoding=self.encoding, newline = '\n')
Tim Peters88869f92001-01-14 23:36:06 +0000824
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000825
Guido van Rossum72755611996-03-06 07:20:06 +0000826# Test/debug code
827# ===============
Guido van Rossum9a22de11995-01-12 12:29:47 +0000828
Guido van Rossum773ab271996-07-23 03:46:24 +0000829def test(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000830 """Robust test CGI script, usable as main program.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000831
Guido van Rossum7aee3841996-03-07 18:00:44 +0000832 Write minimal HTTP headers and dump all information provided to
833 the script in HTML form.
834
835 """
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000836 print("Content-type: text/html")
837 print()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000838 sys.stderr = sys.stdout
839 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000840 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000841 print_directory()
842 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000843 print_form(form)
844 print_environ(environ)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000845 print_environ_usage()
846 def f():
Georg Brandl7cae87c2006-09-06 06:51:57 +0000847 exec("testing print_exception() -- <I>italics?</I>")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000848 def g(f=f):
849 f()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000850 print("<H3>What follows is a test, not an actual exception:</H3>")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000851 g()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000852 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000853 print_exception()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000854
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000855 print("<H1>Second try with a small maxlen...</H1>")
Guido van Rossum57d51f22000-09-16 21:16:01 +0000856
Guido van Rossumad164711997-05-13 19:03:23 +0000857 global maxlen
858 maxlen = 50
859 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000860 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000861 print_directory()
862 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000863 print_form(form)
864 print_environ(environ)
Guido van Rossumad164711997-05-13 19:03:23 +0000865 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000866 print_exception()
Guido van Rossumad164711997-05-13 19:03:23 +0000867
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000868def print_exception(type=None, value=None, tb=None, limit=None):
869 if type is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000870 type, value, tb = sys.exc_info()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000871 import traceback
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000872 print()
873 print("<H3>Traceback (most recent call last):</H3>")
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000874 list = traceback.format_tb(tb, limit) + \
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000875 traceback.format_exception_only(type, value)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000876 print("<PRE>%s<B>%s</B></PRE>" % (
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000877 html.escape("".join(list[:-1])),
878 html.escape(list[-1]),
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000879 ))
Guido van Rossumf15d1591997-09-29 23:22:12 +0000880 del tb
Guido van Rossum9a22de11995-01-12 12:29:47 +0000881
Guido van Rossum773ab271996-07-23 03:46:24 +0000882def print_environ(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000883 """Dump the shell environment as HTML."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000884 keys = sorted(environ.keys())
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000885 print()
886 print("<H3>Shell Environment:</H3>")
887 print("<DL>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000888 for key in keys:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000889 print("<DT>", html.escape(key), "<DD>", html.escape(environ[key]))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000890 print("</DL>")
891 print()
Guido van Rossum72755611996-03-06 07:20:06 +0000892
893def print_form(form):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000894 """Dump the contents of a form as HTML."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000895 keys = sorted(form.keys())
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000896 print()
897 print("<H3>Form Contents:</H3>")
Guido van Rossum57d51f22000-09-16 21:16:01 +0000898 if not keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000899 print("<P>No form fields.")
900 print("<DL>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000901 for key in keys:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000902 print("<DT>" + html.escape(key) + ":", end=' ')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000903 value = form[key]
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000904 print("<i>" + html.escape(repr(type(value))) + "</i>")
905 print("<DD>" + html.escape(repr(value)))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000906 print("</DL>")
907 print()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000908
909def print_directory():
910 """Dump the current directory as HTML."""
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000911 print()
912 print("<H3>Current Working Directory:</H3>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000913 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000914 pwd = os.getcwd()
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200915 except OSError as msg:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200916 print("OSError:", html.escape(str(msg)))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000917 else:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000918 print(html.escape(pwd))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000919 print()
Guido van Rossum9a22de11995-01-12 12:29:47 +0000920
Guido van Rossuma8738a51996-03-14 21:30:28 +0000921def print_arguments():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000922 print()
923 print("<H3>Command Line Arguments:</H3>")
924 print()
925 print(sys.argv)
926 print()
Guido van Rossuma8738a51996-03-14 21:30:28 +0000927
Guido van Rossum9a22de11995-01-12 12:29:47 +0000928def print_environ_usage():
Guido van Rossum7aee3841996-03-07 18:00:44 +0000929 """Dump a list of environment variables used by CGI as HTML."""
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000930 print("""
Guido van Rossum72755611996-03-06 07:20:06 +0000931<H3>These environment variables could have been set:</H3>
932<UL>
Guido van Rossum9a22de11995-01-12 12:29:47 +0000933<LI>AUTH_TYPE
934<LI>CONTENT_LENGTH
935<LI>CONTENT_TYPE
936<LI>DATE_GMT
937<LI>DATE_LOCAL
938<LI>DOCUMENT_NAME
939<LI>DOCUMENT_ROOT
940<LI>DOCUMENT_URI
941<LI>GATEWAY_INTERFACE
942<LI>LAST_MODIFIED
943<LI>PATH
944<LI>PATH_INFO
945<LI>PATH_TRANSLATED
946<LI>QUERY_STRING
947<LI>REMOTE_ADDR
948<LI>REMOTE_HOST
949<LI>REMOTE_IDENT
950<LI>REMOTE_USER
951<LI>REQUEST_METHOD
952<LI>SCRIPT_NAME
953<LI>SERVER_NAME
954<LI>SERVER_PORT
955<LI>SERVER_PROTOCOL
956<LI>SERVER_ROOT
957<LI>SERVER_SOFTWARE
958</UL>
Guido van Rossum7aee3841996-03-07 18:00:44 +0000959In addition, HTTP headers sent by the server may be passed in the
960environment as well. Here are some common variable names:
961<UL>
962<LI>HTTP_ACCEPT
963<LI>HTTP_CONNECTION
964<LI>HTTP_HOST
965<LI>HTTP_PRAGMA
966<LI>HTTP_REFERER
967<LI>HTTP_USER_AGENT
968</UL>
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000969""")
Guido van Rossum9a22de11995-01-12 12:29:47 +0000970
Guido van Rossum9a22de11995-01-12 12:29:47 +0000971
Guido van Rossum72755611996-03-06 07:20:06 +0000972# Utilities
973# =========
Guido van Rossum9a22de11995-01-12 12:29:47 +0000974
Guido van Rossum64c66201997-07-19 20:11:53 +0000975def escape(s, quote=None):
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000976 """Deprecated API."""
977 warn("cgi.escape is deprecated, use html.escape instead",
Florent Xicluna67317752011-12-10 11:07:42 +0100978 DeprecationWarning, stacklevel=2)
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000979 s = s.replace("&", "&amp;") # Must be done first!
980 s = s.replace("<", "&lt;")
981 s = s.replace(">", "&gt;")
Guido van Rossum64c66201997-07-19 20:11:53 +0000982 if quote:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000983 s = s.replace('"', "&quot;")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000984 return s
Guido van Rossum9a22de11995-01-12 12:29:47 +0000985
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000986
Benjamin Peterson4d59a782014-04-03 10:22:10 -0400987def valid_boundary(s):
Guido van Rossum2e441f72001-07-25 21:00:19 +0000988 import re
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000989 if isinstance(s, bytes):
990 _vb_pattern = b"^[ -~]{0,200}[!-~]$"
991 else:
992 _vb_pattern = "^[ -~]{0,200}[!-~]$"
Guido van Rossum2e441f72001-07-25 21:00:19 +0000993 return re.match(_vb_pattern, s)
Guido van Rossum9a22de11995-01-12 12:29:47 +0000994
Guido van Rossum72755611996-03-06 07:20:06 +0000995# Invoke mainline
996# ===============
997
998# Call test() when this file is run as a script (not imported as a module)
Tim Peters88869f92001-01-14 23:36:06 +0000999if __name__ == '__main__':
Guido van Rossum7aee3841996-03-07 18:00:44 +00001000 test()