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
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
(for example, when the user interrupts the form submission by clicking on
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
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
----------------------

View File

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

View File

@ -566,6 +566,12 @@ class FieldStorage:
except AttributeError:
pass
def __enter__(self):
return self
def __exit__(self, *args):
self.file.close()
def __repr__(self):
"""Return a printable representation."""
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 os
import sys
@ -307,6 +307,17 @@ Content-Type: text/plain
got = getattr(files[x], k)
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 = {
'key1': 'value1',
'key2': ['value2x', 'value2y'],
@ -481,9 +492,5 @@ Content-Transfer-Encoding: binary
--AaB03x--
"""
def test_main():
run_unittest(CgiTests)
if __name__ == '__main__':
test_main()
unittest.main()

View File

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