FieldStorage.__init__(): if there is no content-type header, use

text/plain for inner parts, but application/x-www-form-urlencoded
for outer parts.  Honor any existing content-type header.

Lower down, if the content-type header is something we don't
understand (say because it there was a typo in the header coming from
the client), default to text/plain for inner parts, but
application/x-www-form-urlencoded for outer parts.
This commit is contained in:
Barry Warsaw 1999-01-08 17:42:03 +00:00
parent b33f612f33
commit 302331a3b6
1 changed files with 24 additions and 2 deletions

View File

@ -828,9 +828,23 @@ class FieldStorage:
self.filename = pdict['filename'] self.filename = pdict['filename']
# Process content-type header # Process content-type header
ctype, pdict = "text/plain", {} #
# Honor any existing content-type header. But if there is no
# content-type header, use some sensible defaults. Assume
# outerboundary is "" at the outer level, but something non-false
# inside a multi-part. The default for an inner part is text/plain,
# but for an outer part it should be urlencoded. This should catch
# bogus clients which erroneously forget to include a content-type
# header.
#
# See below for what we do if there does exist a content-type header,
# but it happens to be something we don't understand.
if self.headers.has_key('content-type'): if self.headers.has_key('content-type'):
ctype, pdict = parse_header(self.headers['content-type']) ctype, pdict = parse_header(self.headers['content-type'])
elif self.outerboundary:
ctype, pdict = "text/plain", {}
else:
ctype, pdict = 'application/x-www-form-urlencoded', {}
self.type = ctype self.type = ctype
self.type_options = pdict self.type_options = pdict
self.innerboundary = "" self.innerboundary = ""
@ -853,8 +867,16 @@ class FieldStorage:
self.read_urlencoded() self.read_urlencoded()
elif ctype[:10] == 'multipart/': elif ctype[:10] == 'multipart/':
self.read_multi(environ, keep_blank_values, strict_parsing) self.read_multi(environ, keep_blank_values, strict_parsing)
else: elif self.outerboundary:
# we're in an inner part, but the content-type wasn't something we
# understood. default to read_single() because the resulting
# FieldStorage won't be a mapping (and doesn't need to be).
self.read_single() self.read_single()
else:
# we're in an outer part, but the content-type wasn't something we
# understood. we still want the resulting FieldStorage to be a
# mapping, so parse it as if it were urlencoded
self.read_urlencoded()
def __repr__(self): def __repr__(self):
"""Return a printable representation.""" """Return a printable representation."""