Issue #20289: cgi.FieldStorage() now supports the context management protocol.

This commit is contained in:
Berker Peksag 2015-02-06 10:21:37 +02:00
parent 088ca8b947
commit bf5e9604cc
5 changed files with 35 additions and 6 deletions

View file

@ -157,6 +157,9 @@ return bytes)::
if not line: break if not line: break
linecount = linecount + 1 linecount = linecount + 1
:class:`FieldStorage` objects also support being used in a :keyword:`with`
statement, which will automatically close them when done.
If an error is encountered when obtaining the contents of an uploaded file If an error is encountered when obtaining the contents of an uploaded file
(for example, when the user interrupts the form submission by clicking on (for example, when the user interrupts the form submission by clicking on
a Back or Cancel button) the :attr:`~FieldStorage.done` attribute of the a Back or Cancel button) the :attr:`~FieldStorage.done` attribute of the
@ -182,6 +185,10 @@ A form submitted via POST that also has a query string will contain both
The :attr:`~FieldStorage.file` attribute is automatically closed upon the The :attr:`~FieldStorage.file` attribute is automatically closed upon the
garbage collection of the creating :class:`FieldStorage` instance. garbage collection of the creating :class:`FieldStorage` instance.
.. versionchanged:: 3.5
Added support for the context management protocol to the
:class:`FieldStorage` class.
Higher Level Interface Higher Level Interface
---------------------- ----------------------

View file

@ -136,6 +136,12 @@ New Modules
Improved Modules Improved Modules
================ ================
cgi
---
* :class:`FieldStorage` now supports the context management protocol.
(Contributed by Berker Peksag in :issue:`20289`.)
code code
---- ----

View file

@ -566,6 +566,12 @@ class FieldStorage:
except AttributeError: except AttributeError:
pass pass
def __enter__(self):
return self
def __exit__(self, *args):
self.file.close()
def __repr__(self): def __repr__(self):
"""Return a printable representation.""" """Return a printable representation."""
return "FieldStorage(%r, %r, %r)" % ( return "FieldStorage(%r, %r, %r)" % (

View file

@ -1,4 +1,4 @@
from test.support import run_unittest, check_warnings from test.support import check_warnings
import cgi import cgi
import os import os
import sys import sys
@ -307,6 +307,17 @@ Content-Type: text/plain
got = getattr(files[x], k) got = getattr(files[x], k)
self.assertEqual(got, exp) self.assertEqual(got, exp)
def test_fieldstorage_as_context_manager(self):
fp = BytesIO(b'x' * 10)
env = {'REQUEST_METHOD': 'PUT'}
with cgi.FieldStorage(fp=fp, environ=env) as fs:
content = fs.file.read()
self.assertFalse(fs.file.closed)
self.assertTrue(fs.file.closed)
self.assertEqual(content, 'x' * 10)
with self.assertRaisesRegex(ValueError, 'I/O operation on closed file'):
fs.file.read()
_qs_result = { _qs_result = {
'key1': 'value1', 'key1': 'value1',
'key2': ['value2x', 'value2y'], 'key2': ['value2x', 'value2y'],
@ -481,9 +492,5 @@ Content-Transfer-Encoding: binary
--AaB03x-- --AaB03x--
""" """
def test_main():
run_unittest(CgiTests)
if __name__ == '__main__': if __name__ == '__main__':
test_main() unittest.main()

View file

@ -235,6 +235,9 @@ Core and Builtins
Library Library
------- -------
- Issue #20289: cgi.FieldStorage() now supports the context management
protocol.
- Issue #13128: Print response headers for CONNECT requests when debuglevel - Issue #13128: Print response headers for CONNECT requests when debuglevel
> 0. Patch by Demian Brecht. > 0. Patch by Demian Brecht.