blob: b655a057d4be485ebf7ff767e3533e798cf79bfd [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
Georg Brandl1f7fffb2010-10-15 15:57:45 +000041import html
Victor Stinner5c23b8e2011-01-14 13:05:21 +000042import locale
43import tempfile
Guido van Rossum72755611996-03-06 07:20:06 +000044
INADA Naoki698865d2018-06-19 17:28:50 +090045__all__ = ["MiniFieldStorage", "FieldStorage", "parse", "parse_multipart",
Martin Panter1cd27722016-06-06 01:53:28 +000046 "parse_header", "test", "print_exception", "print_environ",
Guido van Rossuma8423a92001-03-19 13:40:44 +000047 "print_form", "print_directory", "print_arguments",
INADA Naoki698865d2018-06-19 17:28:50 +090048 "print_environ_usage"]
Guido van Rossumc204c701996-09-05 19:07:11 +000049
50# Logging support
51# ===============
52
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000053logfile = "" # Filename to log to, if not empty
54logfp = None # File object to log to, if not None
Guido van Rossumc204c701996-09-05 19:07:11 +000055
56def initlog(*allargs):
57 """Write a log message, if there is a log file.
58
59 Even though this function is called initlog(), you should always
60 use log(); log is a variable that is set either to initlog
61 (initially), to dolog (once the log file has been opened), or to
62 nolog (when logging is disabled).
63
64 The first argument is a format string; the remaining arguments (if
65 any) are arguments to the % operator, so e.g.
66 log("%s: %s", "a", "b")
67 will write "a: b" to the log file, followed by a newline.
68
69 If the global logfp is not None, it should be a file object to
70 which log data is written.
71
72 If the global logfp is None, the global logfile may be a string
73 giving a filename to open, in append mode. This file should be
74 world writable!!! If the file can't be opened, logging is
75 silently disabled (since there is no safe place where we could
76 send an error message).
77
78 """
Victor Stinnerd33344a2011-07-14 22:28:36 +020079 global log, logfile, logfp
Guido van Rossumc204c701996-09-05 19:07:11 +000080 if logfile and not logfp:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000081 try:
82 logfp = open(logfile, "a")
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020083 except OSError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000084 pass
Guido van Rossumc204c701996-09-05 19:07:11 +000085 if not logfp:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000086 log = nolog
Guido van Rossumc204c701996-09-05 19:07:11 +000087 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000088 log = dolog
Guido van Rossum68468eb2003-02-27 20:14:51 +000089 log(*allargs)
Guido van Rossumc204c701996-09-05 19:07:11 +000090
91def dolog(fmt, *args):
92 """Write a log message to the log file. See initlog() for docs."""
93 logfp.write(fmt%args + "\n")
94
95def nolog(*allargs):
96 """Dummy function, assigned to log when logging is disabled."""
97 pass
98
Victor Stinnerd33344a2011-07-14 22:28:36 +020099def closelog():
100 """Close the log file."""
101 global log, logfile, logfp
102 logfile = ''
103 if logfp:
104 logfp.close()
105 logfp = None
106 log = initlog
107
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000108log = initlog # The current logging function
Guido van Rossumc204c701996-09-05 19:07:11 +0000109
110
Guido van Rossum72755611996-03-06 07:20:06 +0000111# Parsing functions
112# =================
113
Guido van Rossumad164711997-05-13 19:03:23 +0000114# Maximum input we will accept when REQUEST_METHOD is POST
115# 0 ==> unlimited input
116maxlen = 0
117
Guido van Rossume08c04c1996-11-11 19:29:11 +0000118def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0):
Guido van Rossum773ab271996-07-23 03:46:24 +0000119 """Parse a query in the environment or from a file (default stdin)
120
121 Arguments, all optional:
122
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000123 fp : file pointer; default: sys.stdin.buffer
Guido van Rossum773ab271996-07-23 03:46:24 +0000124
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000125 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000126
127 keep_blank_values: flag indicating whether blank values in
Senthil Kumaran30e86a42010-08-09 20:01:35 +0000128 percent-encoded forms should be treated as blank strings.
Tim Peters88869f92001-01-14 23:36:06 +0000129 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000130 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000131 blank values are to be ignored and treated as if they were
132 not included.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000133
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000134 strict_parsing: flag indicating what to do with parsing errors.
135 If false (the default), errors are silently ignored.
136 If true, errors raise a ValueError exception.
Guido van Rossum773ab271996-07-23 03:46:24 +0000137 """
Raymond Hettingera1449002002-05-31 23:54:44 +0000138 if fp is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000139 fp = sys.stdin
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000140
141 # field keys and values (except for files) are returned as strings
142 # an encoding is required to decode the bytes read from self.fp
143 if hasattr(fp,'encoding'):
144 encoding = fp.encoding
145 else:
146 encoding = 'latin-1'
147
148 # fp.read() must return bytes
149 if isinstance(fp, TextIOWrapper):
150 fp = fp.buffer
151
Raymond Hettinger54f02222002-06-01 14:18:47 +0000152 if not 'REQUEST_METHOD' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000153 environ['REQUEST_METHOD'] = 'GET' # For testing stand-alone
Guido van Rossum7aee3841996-03-07 18:00:44 +0000154 if environ['REQUEST_METHOD'] == 'POST':
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000155 ctype, pdict = parse_header(environ['CONTENT_TYPE'])
156 if ctype == 'multipart/form-data':
157 return parse_multipart(fp, pdict)
158 elif ctype == 'application/x-www-form-urlencoded':
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000159 clength = int(environ['CONTENT_LENGTH'])
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000160 if maxlen and clength > maxlen:
Collin Winterce36ad82007-08-30 01:19:48 +0000161 raise ValueError('Maximum content length exceeded')
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000162 qs = fp.read(clength).decode(encoding)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000163 else:
164 qs = '' # Unknown content-type
Raymond Hettinger54f02222002-06-01 14:18:47 +0000165 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000166 if qs: qs = qs + '&'
167 qs = qs + environ['QUERY_STRING']
Tim Peters88869f92001-01-14 23:36:06 +0000168 elif sys.argv[1:]:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000169 if qs: qs = qs + '&'
170 qs = qs + sys.argv[1]
171 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
Raymond Hettinger54f02222002-06-01 14:18:47 +0000172 elif 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000173 qs = environ['QUERY_STRING']
Guido van Rossum7aee3841996-03-07 18:00:44 +0000174 else:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000175 if sys.argv[1:]:
176 qs = sys.argv[1]
177 else:
178 qs = ""
179 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000180 return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing,
181 encoding=encoding)
Guido van Rossume7808771995-08-07 20:12:09 +0000182
183
Amber Brown545c9552018-05-14 18:11:55 -0400184def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000185 """Parse multipart input.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000186
Guido van Rossum7aee3841996-03-07 18:00:44 +0000187 Arguments:
188 fp : input file
Johannes Gijsbersc7fc10a2005-01-08 13:56:36 +0000189 pdict: dictionary containing other parameters of content-type header
Amber Brown545c9552018-05-14 18:11:55 -0400190 encoding, errors: request encoding and error handler, passed to
191 FieldStorage
Guido van Rossum72755611996-03-06 07:20:06 +0000192
Tim Peters88869f92001-01-14 23:36:06 +0000193 Returns a dictionary just like parse_qs(): keys are the field names, each
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200194 value is a list of values for that field. For non-file fields, the value
195 is a list of strings.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000196 """
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200197 # RFC 2026, Section 5.1 : The "multipart" boundary delimiters are always
198 # represented as 7bit US-ASCII.
199 boundary = pdict['boundary'].decode('ascii')
200 ctype = "multipart/form-data; boundary={}".format(boundary)
201 headers = Message()
202 headers.set_type(ctype)
203 headers['Content-Length'] = pdict['CONTENT-LENGTH']
Amber Brown545c9552018-05-14 18:11:55 -0400204 fs = FieldStorage(fp, headers=headers, encoding=encoding, errors=errors,
Pierre Quentelcc3fa202017-05-08 14:08:34 +0200205 environ={'REQUEST_METHOD': 'POST'})
206 return {k: fs.getlist(k) for k in fs}
Guido van Rossum9a22de11995-01-12 12:29:47 +0000207
Fred Drake9a0a65b2008-12-04 19:24:50 +0000208def _parseparam(s):
209 while s[:1] == ';':
210 s = s[1:]
211 end = s.find(';')
Senthil Kumaran1ef0c032011-10-20 01:05:44 +0800212 while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2:
Fred Drake9a0a65b2008-12-04 19:24:50 +0000213 end = s.find(';', end + 1)
214 if end < 0:
215 end = len(s)
216 f = s[:end]
217 yield f.strip()
218 s = s[end:]
219
Guido van Rossum72755611996-03-06 07:20:06 +0000220def parse_header(line):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000221 """Parse a Content-type like header.
222
223 Return the main content-type and a dictionary of options.
224
225 """
Fred Drake9a0a65b2008-12-04 19:24:50 +0000226 parts = _parseparam(';' + line)
227 key = parts.__next__()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000228 pdict = {}
Fred Drake9a0a65b2008-12-04 19:24:50 +0000229 for p in parts:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000230 i = p.find('=')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000231 if i >= 0:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000232 name = p[:i].strip().lower()
233 value = p[i+1:].strip()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000234 if len(value) >= 2 and value[0] == value[-1] == '"':
235 value = value[1:-1]
Johannes Gijsbers9e15dd62004-08-14 15:39:34 +0000236 value = value.replace('\\\\', '\\').replace('\\"', '"')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000237 pdict[name] = value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000238 return key, pdict
Guido van Rossum72755611996-03-06 07:20:06 +0000239
240
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000241# Classes for field storage
242# =========================
243
244class MiniFieldStorage:
245
Guido van Rossum0147db01996-03-09 03:16:04 +0000246 """Like FieldStorage, for use when no file uploads are possible."""
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000247
Guido van Rossum7aee3841996-03-07 18:00:44 +0000248 # Dummy attributes
249 filename = None
250 list = None
251 type = None
Guido van Rossum773ab271996-07-23 03:46:24 +0000252 file = None
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000253 type_options = {}
Guido van Rossum7aee3841996-03-07 18:00:44 +0000254 disposition = None
255 disposition_options = {}
256 headers = {}
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000257
Guido van Rossum7aee3841996-03-07 18:00:44 +0000258 def __init__(self, name, value):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000259 """Constructor from field name and value."""
260 self.name = name
261 self.value = value
Guido van Rossum773ab271996-07-23 03:46:24 +0000262 # self.file = StringIO(value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000263
264 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000265 """Return printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000266 return "MiniFieldStorage(%r, %r)" % (self.name, self.value)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000267
268
269class FieldStorage:
270
Guido van Rossum7aee3841996-03-07 18:00:44 +0000271 """Store a sequence of fields, reading multipart/form-data.
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000272
Guido van Rossum7aee3841996-03-07 18:00:44 +0000273 This class provides naming, typing, files stored on disk, and
274 more. At the top level, it is accessible like a dictionary, whose
275 keys are the field names. (Note: None can occur as a field name.)
276 The items are either a Python list (if there's multiple values) or
277 another FieldStorage or MiniFieldStorage object. If it's a single
278 object, it has the following attributes:
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000279
Guido van Rossum7aee3841996-03-07 18:00:44 +0000280 name: the field name, if specified; otherwise None
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000281
Guido van Rossum7aee3841996-03-07 18:00:44 +0000282 filename: the filename, if specified; otherwise None; this is the
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000283 client side filename, *not* the file name on which it is
284 stored (that's a temporary file you don't deal with)
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000285
Guido van Rossum7aee3841996-03-07 18:00:44 +0000286 value: the value as a *string*; for file uploads, this
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000287 transparently reads the file every time you request the value
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000288 and returns *bytes*
Guido van Rossum7aee3841996-03-07 18:00:44 +0000289
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000290 file: the file(-like) object from which you can read the data *as
291 bytes* ; None if the data is stored a simple string
Guido van Rossum7aee3841996-03-07 18:00:44 +0000292
293 type: the content-type, or None if not specified
294
295 type_options: dictionary of options specified on the content-type
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000296 line
Guido van Rossum7aee3841996-03-07 18:00:44 +0000297
298 disposition: content-disposition, or None if not specified
299
300 disposition_options: dictionary of corresponding options
301
Barry Warsaw596097e2008-06-12 02:38:51 +0000302 headers: a dictionary(-like) object (sometimes email.message.Message or a
Armin Rigo3a703b62005-09-19 09:11:04 +0000303 subclass thereof) containing *all* headers
Guido van Rossum7aee3841996-03-07 18:00:44 +0000304
305 The class is subclassable, mostly for the purpose of overriding
306 the make_file() method, which is called internally to come up with
307 a file open for reading and writing. This makes it possible to
308 override the default choice of storing all files in a temporary
309 directory and unlinking them as soon as they have been opened.
310
311 """
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000312 def __init__(self, fp=None, headers=None, outerboundary=b'',
313 environ=os.environ, keep_blank_values=0, strict_parsing=0,
314 limit=None, encoding='utf-8', errors='replace'):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000315 """Constructor. Read multipart/* until last part.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000316
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000317 Arguments, all optional:
Guido van Rossum7aee3841996-03-07 18:00:44 +0000318
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000319 fp : file pointer; default: sys.stdin.buffer
Guido van Rossumb1b4f941998-05-08 19:55:51 +0000320 (not used when the request method is GET)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000321 Can be :
322 1. a TextIOWrapper object
323 2. an object whose read() and readline() methods return bytes
Guido van Rossum7aee3841996-03-07 18:00:44 +0000324
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000325 headers : header dictionary-like object; default:
326 taken from environ as per CGI spec
Guido van Rossum7aee3841996-03-07 18:00:44 +0000327
Guido van Rossum773ab271996-07-23 03:46:24 +0000328 outerboundary : terminating multipart boundary
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000329 (for internal use only)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000330
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000331 environ : environment dictionary; default: os.environ
Guido van Rossum773ab271996-07-23 03:46:24 +0000332
333 keep_blank_values: flag indicating whether blank values in
Senthil Kumaran30e86a42010-08-09 20:01:35 +0000334 percent-encoded forms should be treated as blank strings.
Tim Peters88869f92001-01-14 23:36:06 +0000335 A true value indicates that blanks should be retained as
Guido van Rossum773ab271996-07-23 03:46:24 +0000336 blank strings. The default false value indicates that
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000337 blank values are to be ignored and treated as if they were
338 not included.
Guido van Rossum773ab271996-07-23 03:46:24 +0000339
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000340 strict_parsing: flag indicating what to do with parsing errors.
341 If false (the default), errors are silently ignored.
342 If true, errors raise a ValueError exception.
Guido van Rossume08c04c1996-11-11 19:29:11 +0000343
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000344 limit : used internally to read parts of multipart/form-data forms,
345 to exit from the reading loop when reached. It is the difference
346 between the form content-length and the number of bytes already
347 read
348
349 encoding, errors : the encoding and error handler used to decode the
350 binary stream to strings. Must be the same as the charset defined
351 for the page sending the form (content-type : meta http-equiv or
352 header)
353
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000354 """
355 method = 'GET'
356 self.keep_blank_values = keep_blank_values
357 self.strict_parsing = strict_parsing
Raymond Hettinger54f02222002-06-01 14:18:47 +0000358 if 'REQUEST_METHOD' in environ:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000359 method = environ['REQUEST_METHOD'].upper()
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000360 self.qs_on_post = None
Guido van Rossum01852831998-06-25 02:40:17 +0000361 if method == 'GET' or method == 'HEAD':
Raymond Hettinger54f02222002-06-01 14:18:47 +0000362 if 'QUERY_STRING' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000363 qs = environ['QUERY_STRING']
364 elif sys.argv[1:]:
365 qs = sys.argv[1]
366 else:
367 qs = ""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000368 qs = qs.encode(locale.getpreferredencoding(), 'surrogateescape')
369 fp = BytesIO(qs)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000370 if headers is None:
371 headers = {'content-type':
372 "application/x-www-form-urlencoded"}
373 if headers is None:
Guido van Rossumcff311a1998-06-11 14:06:59 +0000374 headers = {}
375 if method == 'POST':
376 # Set default content-type for POST to what's traditional
377 headers['content-type'] = "application/x-www-form-urlencoded"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000378 if 'CONTENT_TYPE' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000379 headers['content-type'] = environ['CONTENT_TYPE']
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000380 if 'QUERY_STRING' in environ:
381 self.qs_on_post = environ['QUERY_STRING']
Raymond Hettinger54f02222002-06-01 14:18:47 +0000382 if 'CONTENT_LENGTH' in environ:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000383 headers['content-length'] = environ['CONTENT_LENGTH']
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800384 else:
385 if not (isinstance(headers, (Mapping, Message))):
386 raise TypeError("headers must be mapping or an instance of "
387 "email.message.Message")
388 self.headers = headers
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000389 if fp is None:
390 self.fp = sys.stdin.buffer
391 # self.fp.read() must return bytes
392 elif isinstance(fp, TextIOWrapper):
393 self.fp = fp.buffer
394 else:
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800395 if not (hasattr(fp, 'read') and hasattr(fp, 'readline')):
396 raise TypeError("fp must be file pointer")
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000397 self.fp = fp
398
399 self.encoding = encoding
400 self.errors = errors
401
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000402 if not isinstance(outerboundary, bytes):
403 raise TypeError('outerboundary must be bytes, not %s'
404 % type(outerboundary).__name__)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000405 self.outerboundary = outerboundary
Guido van Rossum7aee3841996-03-07 18:00:44 +0000406
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000407 self.bytes_read = 0
408 self.limit = limit
409
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000410 # Process content-disposition header
411 cdisp, pdict = "", {}
Raymond Hettinger54f02222002-06-01 14:18:47 +0000412 if 'content-disposition' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000413 cdisp, pdict = parse_header(self.headers['content-disposition'])
414 self.disposition = cdisp
415 self.disposition_options = pdict
416 self.name = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000417 if 'name' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000418 self.name = pdict['name']
419 self.filename = None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000420 if 'filename' in pdict:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000421 self.filename = pdict['filename']
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000422 self._binary_file = self.filename is not None
Guido van Rossum7aee3841996-03-07 18:00:44 +0000423
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000424 # Process content-type header
Barry Warsaw302331a1999-01-08 17:42:03 +0000425 #
426 # Honor any existing content-type header. But if there is no
427 # content-type header, use some sensible defaults. Assume
428 # outerboundary is "" at the outer level, but something non-false
429 # inside a multi-part. The default for an inner part is text/plain,
430 # but for an outer part it should be urlencoded. This should catch
431 # bogus clients which erroneously forget to include a content-type
432 # header.
433 #
434 # See below for what we do if there does exist a content-type header,
435 # but it happens to be something we don't understand.
Raymond Hettinger54f02222002-06-01 14:18:47 +0000436 if 'content-type' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000437 ctype, pdict = parse_header(self.headers['content-type'])
Guido van Rossumce900de1999-06-02 18:44:22 +0000438 elif self.outerboundary or method != 'POST':
Barry Warsaw302331a1999-01-08 17:42:03 +0000439 ctype, pdict = "text/plain", {}
440 else:
441 ctype, pdict = 'application/x-www-form-urlencoded', {}
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000442 self.type = ctype
443 self.type_options = pdict
Raymond Hettinger54f02222002-06-01 14:18:47 +0000444 if 'boundary' in pdict:
Amber Brown545c9552018-05-14 18:11:55 -0400445 self.innerboundary = pdict['boundary'].encode(self.encoding,
446 self.errors)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000447 else:
448 self.innerboundary = b""
449
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000450 clen = -1
Raymond Hettinger54f02222002-06-01 14:18:47 +0000451 if 'content-length' in self.headers:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000452 try:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000453 clen = int(self.headers['content-length'])
Skip Montanarodb5d1442002-03-23 05:50:17 +0000454 except ValueError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000455 pass
456 if maxlen and clen > maxlen:
Collin Winterce36ad82007-08-30 01:19:48 +0000457 raise ValueError('Maximum content length exceeded')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000458 self.length = clen
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000459 if self.limit is None and clen:
460 self.limit = clen
Guido van Rossum7aee3841996-03-07 18:00:44 +0000461
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000462 self.list = self.file = None
463 self.done = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000464 if ctype == 'application/x-www-form-urlencoded':
465 self.read_urlencoded()
466 elif ctype[:10] == 'multipart/':
Guido van Rossumf5745001998-10-20 14:43:02 +0000467 self.read_multi(environ, keep_blank_values, strict_parsing)
Barry Warsaw302331a1999-01-08 17:42:03 +0000468 else:
Guido van Rossum60a3bd81999-06-11 18:26:09 +0000469 self.read_single()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000470
Brett Cannonf79126f2013-08-23 15:15:48 -0400471 def __del__(self):
472 try:
473 self.file.close()
474 except AttributeError:
475 pass
476
Berker Peksagbf5e9602015-02-06 10:21:37 +0200477 def __enter__(self):
478 return self
479
480 def __exit__(self, *args):
481 self.file.close()
482
Guido van Rossum7aee3841996-03-07 18:00:44 +0000483 def __repr__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000484 """Return a printable representation."""
Walter Dörwald70a6b492004-02-12 17:35:32 +0000485 return "FieldStorage(%r, %r, %r)" % (
486 self.name, self.filename, self.value)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000487
Guido van Rossum4061cbe2002-09-11 18:20:34 +0000488 def __iter__(self):
489 return iter(self.keys())
490
Guido van Rossum7aee3841996-03-07 18:00:44 +0000491 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000492 if name != 'value':
Collin Winterce36ad82007-08-30 01:19:48 +0000493 raise AttributeError(name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000494 if self.file:
495 self.file.seek(0)
496 value = self.file.read()
497 self.file.seek(0)
498 elif self.list is not None:
499 value = self.list
500 else:
501 value = None
502 return value
Guido van Rossum7aee3841996-03-07 18:00:44 +0000503
504 def __getitem__(self, key):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000505 """Dictionary style indexing."""
506 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000507 raise TypeError("not indexable")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000508 found = []
509 for item in self.list:
510 if item.name == key: found.append(item)
511 if not found:
Collin Winterce36ad82007-08-30 01:19:48 +0000512 raise KeyError(key)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000513 if len(found) == 1:
514 return found[0]
515 else:
516 return found
Guido van Rossum7aee3841996-03-07 18:00:44 +0000517
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000518 def getvalue(self, key, default=None):
519 """Dictionary style get() method, including 'value' lookup."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000520 if key in self:
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000521 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000522 if isinstance(value, list):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000523 return [x.value for x in value]
Moshe Zadkaa1a4b592000-08-25 21:47:56 +0000524 else:
525 return value.value
526 else:
527 return default
528
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000529 def getfirst(self, key, default=None):
530 """ Return the first value received."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000531 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000532 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000533 if isinstance(value, list):
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000534 return value[0].value
535 else:
536 return value.value
537 else:
538 return default
539
540 def getlist(self, key):
541 """ Return list of received values."""
Raymond Hettinger54f02222002-06-01 14:18:47 +0000542 if key in self:
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000543 value = self[key]
Victor Stinnerf1c7ca92011-01-14 13:08:27 +0000544 if isinstance(value, list):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000545 return [x.value for x in value]
Guido van Rossum1bfb3882001-09-05 19:45:34 +0000546 else:
547 return [value.value]
548 else:
549 return []
550
Guido van Rossum7aee3841996-03-07 18:00:44 +0000551 def keys(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000552 """Dictionary style keys() method."""
553 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000554 raise TypeError("not indexable")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000555 return list(set(item.name for item in self.list))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000556
Raymond Hettinger54f02222002-06-01 14:18:47 +0000557 def __contains__(self, key):
558 """Dictionary style __contains__ method."""
559 if self.list is None:
Collin Winterce36ad82007-08-30 01:19:48 +0000560 raise TypeError("not indexable")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000561 return any(item.name == key for item in self.list)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000562
Guido van Rossum88b85d41997-01-11 19:21:33 +0000563 def __len__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000564 """Dictionary style len(x) support."""
565 return len(self.keys())
Guido van Rossum88b85d41997-01-11 19:21:33 +0000566
Senthil Kumaranb4cbb922014-01-11 22:20:16 -0800567 def __bool__(self):
568 if self.list is None:
569 raise TypeError("Cannot be converted to bool.")
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000570 return bool(self.list)
571
Guido van Rossum7aee3841996-03-07 18:00:44 +0000572 def read_urlencoded(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000573 """Internal: read data in query string format."""
574 qs = self.fp.read(self.length)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000575 if not isinstance(qs, bytes):
576 raise ValueError("%s should return bytes, got %s" \
577 % (self.fp, type(qs).__name__))
578 qs = qs.decode(self.encoding, self.errors)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000579 if self.qs_on_post:
580 qs += '&' + self.qs_on_post
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000581 self.list = []
582 query = urllib.parse.parse_qsl(
583 qs, self.keep_blank_values, self.strict_parsing,
584 encoding=self.encoding, errors=self.errors)
585 for key, value in query:
586 self.list.append(MiniFieldStorage(key, value))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000587 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000588
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000589 FieldStorageClass = None
590
Guido van Rossumf5745001998-10-20 14:43:02 +0000591 def read_multi(self, environ, keep_blank_values, strict_parsing):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000592 """Internal: read a part that is itself multipart."""
Guido van Rossum2e441f72001-07-25 21:00:19 +0000593 ib = self.innerboundary
594 if not valid_boundary(ib):
Collin Winterce36ad82007-08-30 01:19:48 +0000595 raise ValueError('Invalid boundary in multipart form: %r' % (ib,))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000596 self.list = []
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000597 if self.qs_on_post:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000598 query = urllib.parse.parse_qsl(
599 self.qs_on_post, self.keep_blank_values, self.strict_parsing,
600 encoding=self.encoding, errors=self.errors)
601 for key, value in query:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000602 self.list.append(MiniFieldStorage(key, value))
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000603
Guido van Rossum030d2ec1998-12-09 22:16:46 +0000604 klass = self.FieldStorageClass or self.__class__
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000605 first_line = self.fp.readline() # bytes
606 if not isinstance(first_line, bytes):
607 raise ValueError("%s should return bytes, got %s" \
608 % (self.fp, type(first_line).__name__))
609 self.bytes_read += len(first_line)
Donald Stufftd90f8d12015-03-29 16:43:23 -0400610
611 # Ensure that we consume the file until we've hit our inner boundary
612 while (first_line.strip() != (b"--" + self.innerboundary) and
613 first_line):
614 first_line = self.fp.readline()
615 self.bytes_read += len(first_line)
616
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000617 while True:
618 parser = FeedParser()
619 hdr_text = b""
620 while True:
621 data = self.fp.readline()
622 hdr_text += data
623 if not data.strip():
624 break
625 if not hdr_text:
626 break
627 # parser takes strings, not bytes
628 self.bytes_read += len(hdr_text)
629 parser.feed(hdr_text.decode(self.encoding, self.errors))
630 headers = parser.close()
Victor Stinner65794592015-08-18 10:21:10 -0700631
632 # Some clients add Content-Length for part headers, ignore them
633 if 'content-length' in headers:
634 del headers['content-length']
635
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000636 part = klass(self.fp, headers, ib, environ, keep_blank_values,
637 strict_parsing,self.limit-self.bytes_read,
638 self.encoding, self.errors)
639 self.bytes_read += part.bytes_read
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000640 self.list.append(part)
Florent Xicluna331c3fd2013-07-07 12:44:28 +0200641 if part.done or self.bytes_read >= self.length > 0:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000642 break
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000643 self.skip_lines()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000644
645 def read_single(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000646 """Internal: read an atomic part."""
647 if self.length >= 0:
648 self.read_binary()
649 self.skip_lines()
650 else:
651 self.read_lines()
652 self.file.seek(0)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000653
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000654 bufsize = 8*1024 # I/O buffering size for copy to file
Guido van Rossum7aee3841996-03-07 18:00:44 +0000655
656 def read_binary(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000657 """Internal: read binary data."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000658 self.file = self.make_file()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000659 todo = self.length
660 if todo >= 0:
661 while todo > 0:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000662 data = self.fp.read(min(todo, self.bufsize)) # bytes
663 if not isinstance(data, bytes):
664 raise ValueError("%s should return bytes, got %s"
665 % (self.fp, type(data).__name__))
666 self.bytes_read += len(data)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000667 if not data:
668 self.done = -1
669 break
670 self.file.write(data)
671 todo = todo - len(data)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000672
673 def read_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000674 """Internal: read lines until EOF or outerboundary."""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000675 if self._binary_file:
676 self.file = self.__file = BytesIO() # store data as bytes for files
677 else:
678 self.file = self.__file = StringIO() # as strings for other fields
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000679 if self.outerboundary:
680 self.read_lines_to_outerboundary()
681 else:
682 self.read_lines_to_eof()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000683
Guido van Rossum52b8c292001-06-29 13:06:06 +0000684 def __write(self, line):
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000685 """line is always bytes, not string"""
Guido van Rossum52b8c292001-06-29 13:06:06 +0000686 if self.__file is not None:
687 if self.__file.tell() + len(line) > 1000:
Guido van Rossuma1a68522007-08-28 03:11:34 +0000688 self.file = self.make_file()
689 data = self.__file.getvalue()
690 self.file.write(data)
Guido van Rossum52b8c292001-06-29 13:06:06 +0000691 self.__file = None
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000692 if self._binary_file:
693 # keep bytes
694 self.file.write(line)
695 else:
696 # decode to string
697 self.file.write(line.decode(self.encoding, self.errors))
Guido van Rossum52b8c292001-06-29 13:06:06 +0000698
Guido van Rossum7aee3841996-03-07 18:00:44 +0000699 def read_lines_to_eof(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000700 """Internal: read lines until EOF."""
701 while 1:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000702 line = self.fp.readline(1<<16) # bytes
703 self.bytes_read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000704 if not line:
705 self.done = -1
706 break
Guido van Rossum52b8c292001-06-29 13:06:06 +0000707 self.__write(line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000708
709 def read_lines_to_outerboundary(self):
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000710 """Internal: read lines until outerboundary.
711 Data is read as bytes: boundaries and line ends must be converted
712 to bytes for comparisons.
713 """
714 next_boundary = b"--" + self.outerboundary
715 last_boundary = next_boundary + b"--"
716 delim = b""
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000717 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000718 _read = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000719 while 1:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000720 if _read >= self.limit:
721 break
722 line = self.fp.readline(1<<16) # bytes
723 self.bytes_read += len(line)
724 _read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000725 if not line:
726 self.done = -1
727 break
Serhiy Storchakac7bfe0e2013-06-17 16:34:41 +0300728 if delim == b"\r":
729 line = delim + line
730 delim = b""
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000731 if line.startswith(b"--") and last_line_lfend:
732 strippedline = line.rstrip()
733 if strippedline == next_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000734 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000735 if strippedline == last_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000736 self.done = 1
737 break
738 odelim = delim
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000739 if line.endswith(b"\r\n"):
740 delim = b"\r\n"
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000741 line = line[:-2]
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000742 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000743 elif line.endswith(b"\n"):
744 delim = b"\n"
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000745 line = line[:-1]
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000746 last_line_lfend = True
Serhiy Storchakac7bfe0e2013-06-17 16:34:41 +0300747 elif line.endswith(b"\r"):
748 # We may interrupt \r\n sequences if they span the 2**16
749 # byte boundary
750 delim = b"\r"
751 line = line[:-1]
752 last_line_lfend = False
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000753 else:
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000754 delim = b""
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000755 last_line_lfend = False
Guido van Rossum52b8c292001-06-29 13:06:06 +0000756 self.__write(odelim + line)
Guido van Rossum7aee3841996-03-07 18:00:44 +0000757
758 def skip_lines(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000759 """Internal: skip lines until outer boundary if defined."""
760 if not self.outerboundary or self.done:
761 return
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000762 next_boundary = b"--" + self.outerboundary
763 last_boundary = next_boundary + b"--"
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000764 last_line_lfend = True
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000765 while True:
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000766 line = self.fp.readline(1<<16)
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000767 self.bytes_read += len(line)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000768 if not line:
769 self.done = -1
770 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000771 if line.endswith(b"--") and last_line_lfend:
Eric S. Raymond7e9b4f52001-02-09 09:59:10 +0000772 strippedline = line.strip()
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000773 if strippedline == next_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000774 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000775 if strippedline == last_boundary:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000776 self.done = 1
777 break
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000778 last_line_lfend = line.endswith(b'\n')
Guido van Rossum7aee3841996-03-07 18:00:44 +0000779
Guido van Rossuma1a68522007-08-28 03:11:34 +0000780 def make_file(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000781 """Overridable: return a readable & writable file.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000782
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000783 The file will be used as follows:
784 - data is written to it
785 - seek(0)
786 - data is read from it
Guido van Rossum7aee3841996-03-07 18:00:44 +0000787
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000788 The file is opened in binary mode for files, in text mode
789 for other fields
Guido van Rossum7aee3841996-03-07 18:00:44 +0000790
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000791 This version opens a temporary file for reading and writing,
792 and immediately deletes (unlinks) it. The trick (on Unix!) is
793 that the file can still be used, but it can't be opened by
794 another process, and it will automatically be deleted when it
795 is closed or when the current process terminates.
Guido van Rossum4032c2c1996-03-09 04:04:35 +0000796
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000797 If you want a more permanent file, you derive a class which
798 overrides this method. If you want a visible temporary file
799 that is nevertheless automatically deleted when the script
800 terminates, try defining a __del__ method in a derived class
801 which unlinks the temporary files you have created.
Guido van Rossum7aee3841996-03-07 18:00:44 +0000802
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000803 """
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000804 if self._binary_file:
805 return tempfile.TemporaryFile("wb+")
806 else:
807 return tempfile.TemporaryFile("w+",
808 encoding=self.encoding, newline = '\n')
Tim Peters88869f92001-01-14 23:36:06 +0000809
Guido van Rossum243ddcd1996-03-07 06:33:07 +0000810
Guido van Rossum72755611996-03-06 07:20:06 +0000811# Test/debug code
812# ===============
Guido van Rossum9a22de11995-01-12 12:29:47 +0000813
Guido van Rossum773ab271996-07-23 03:46:24 +0000814def test(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000815 """Robust test CGI script, usable as main program.
Guido van Rossum9a22de11995-01-12 12:29:47 +0000816
Guido van Rossum7aee3841996-03-07 18:00:44 +0000817 Write minimal HTTP headers and dump all information provided to
818 the script in HTML form.
819
820 """
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000821 print("Content-type: text/html")
822 print()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000823 sys.stderr = sys.stdout
824 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000825 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000826 print_directory()
827 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000828 print_form(form)
829 print_environ(environ)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000830 print_environ_usage()
831 def f():
Georg Brandl7cae87c2006-09-06 06:51:57 +0000832 exec("testing print_exception() -- <I>italics?</I>")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000833 def g(f=f):
834 f()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000835 print("<H3>What follows is a test, not an actual exception:</H3>")
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000836 g()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000837 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000838 print_exception()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000839
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000840 print("<H1>Second try with a small maxlen...</H1>")
Guido van Rossum57d51f22000-09-16 21:16:01 +0000841
Guido van Rossumad164711997-05-13 19:03:23 +0000842 global maxlen
843 maxlen = 50
844 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000845 form = FieldStorage() # Replace with other classes to test those
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000846 print_directory()
847 print_arguments()
Guido van Rossuma3c6a8a2000-09-19 04:11:46 +0000848 print_form(form)
849 print_environ(environ)
Guido van Rossumad164711997-05-13 19:03:23 +0000850 except:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000851 print_exception()
Guido van Rossumad164711997-05-13 19:03:23 +0000852
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000853def print_exception(type=None, value=None, tb=None, limit=None):
854 if type is None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000855 type, value, tb = sys.exc_info()
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000856 import traceback
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000857 print()
858 print("<H3>Traceback (most recent call last):</H3>")
Guido van Rossumf85de8a1996-08-20 20:22:39 +0000859 list = traceback.format_tb(tb, limit) + \
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000860 traceback.format_exception_only(type, value)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000861 print("<PRE>%s<B>%s</B></PRE>" % (
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000862 html.escape("".join(list[:-1])),
863 html.escape(list[-1]),
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000864 ))
Guido van Rossumf15d1591997-09-29 23:22:12 +0000865 del tb
Guido van Rossum9a22de11995-01-12 12:29:47 +0000866
Guido van Rossum773ab271996-07-23 03:46:24 +0000867def print_environ(environ=os.environ):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000868 """Dump the shell environment as HTML."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000869 keys = sorted(environ.keys())
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000870 print()
871 print("<H3>Shell Environment:</H3>")
872 print("<DL>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000873 for key in keys:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000874 print("<DT>", html.escape(key), "<DD>", html.escape(environ[key]))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000875 print("</DL>")
876 print()
Guido van Rossum72755611996-03-06 07:20:06 +0000877
878def print_form(form):
Guido van Rossum7aee3841996-03-07 18:00:44 +0000879 """Dump the contents of a form as HTML."""
Guido van Rossuma1a68522007-08-28 03:11:34 +0000880 keys = sorted(form.keys())
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000881 print()
882 print("<H3>Form Contents:</H3>")
Guido van Rossum57d51f22000-09-16 21:16:01 +0000883 if not keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000884 print("<P>No form fields.")
885 print("<DL>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000886 for key in keys:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000887 print("<DT>" + html.escape(key) + ":", end=' ')
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000888 value = form[key]
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000889 print("<i>" + html.escape(repr(type(value))) + "</i>")
890 print("<DD>" + html.escape(repr(value)))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000891 print("</DL>")
892 print()
Guido van Rossum7aee3841996-03-07 18:00:44 +0000893
894def print_directory():
895 """Dump the current directory as HTML."""
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000896 print()
897 print("<H3>Current Working Directory:</H3>")
Guido van Rossum7aee3841996-03-07 18:00:44 +0000898 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000899 pwd = os.getcwd()
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200900 except OSError as msg:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200901 print("OSError:", html.escape(str(msg)))
Guido van Rossum7aee3841996-03-07 18:00:44 +0000902 else:
Georg Brandl1f7fffb2010-10-15 15:57:45 +0000903 print(html.escape(pwd))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000904 print()
Guido van Rossum9a22de11995-01-12 12:29:47 +0000905
Guido van Rossuma8738a51996-03-14 21:30:28 +0000906def print_arguments():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000907 print()
908 print("<H3>Command Line Arguments:</H3>")
909 print()
910 print(sys.argv)
911 print()
Guido van Rossuma8738a51996-03-14 21:30:28 +0000912
Guido van Rossum9a22de11995-01-12 12:29:47 +0000913def print_environ_usage():
Guido van Rossum7aee3841996-03-07 18:00:44 +0000914 """Dump a list of environment variables used by CGI as HTML."""
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000915 print("""
Guido van Rossum72755611996-03-06 07:20:06 +0000916<H3>These environment variables could have been set:</H3>
917<UL>
Guido van Rossum9a22de11995-01-12 12:29:47 +0000918<LI>AUTH_TYPE
919<LI>CONTENT_LENGTH
920<LI>CONTENT_TYPE
921<LI>DATE_GMT
922<LI>DATE_LOCAL
923<LI>DOCUMENT_NAME
924<LI>DOCUMENT_ROOT
925<LI>DOCUMENT_URI
926<LI>GATEWAY_INTERFACE
927<LI>LAST_MODIFIED
928<LI>PATH
929<LI>PATH_INFO
930<LI>PATH_TRANSLATED
931<LI>QUERY_STRING
932<LI>REMOTE_ADDR
933<LI>REMOTE_HOST
934<LI>REMOTE_IDENT
935<LI>REMOTE_USER
936<LI>REQUEST_METHOD
937<LI>SCRIPT_NAME
938<LI>SERVER_NAME
939<LI>SERVER_PORT
940<LI>SERVER_PROTOCOL
941<LI>SERVER_ROOT
942<LI>SERVER_SOFTWARE
943</UL>
Guido van Rossum7aee3841996-03-07 18:00:44 +0000944In addition, HTTP headers sent by the server may be passed in the
945environment as well. Here are some common variable names:
946<UL>
947<LI>HTTP_ACCEPT
948<LI>HTTP_CONNECTION
949<LI>HTTP_HOST
950<LI>HTTP_PRAGMA
951<LI>HTTP_REFERER
952<LI>HTTP_USER_AGENT
953</UL>
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000954""")
Guido van Rossum9a22de11995-01-12 12:29:47 +0000955
Guido van Rossum9a22de11995-01-12 12:29:47 +0000956
Guido van Rossum72755611996-03-06 07:20:06 +0000957# Utilities
958# =========
Guido van Rossum9a22de11995-01-12 12:29:47 +0000959
Benjamin Peterson4d59a782014-04-03 10:22:10 -0400960def valid_boundary(s):
Guido van Rossum2e441f72001-07-25 21:00:19 +0000961 import re
Victor Stinner5c23b8e2011-01-14 13:05:21 +0000962 if isinstance(s, bytes):
963 _vb_pattern = b"^[ -~]{0,200}[!-~]$"
964 else:
965 _vb_pattern = "^[ -~]{0,200}[!-~]$"
Guido van Rossum2e441f72001-07-25 21:00:19 +0000966 return re.match(_vb_pattern, s)
Guido van Rossum9a22de11995-01-12 12:29:47 +0000967
Guido van Rossum72755611996-03-06 07:20:06 +0000968# Invoke mainline
969# ===============
970
971# Call test() when this file is run as a script (not imported as a module)
Tim Peters88869f92001-01-14 23:36:06 +0000972if __name__ == '__main__':
Guido van Rossum7aee3841996-03-07 18:00:44 +0000973 test()