Commit bf5e9604 authored by Berker Peksag's avatar Berker Peksag

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

parent 088ca8b9
...@@ -157,6 +157,9 @@ return bytes):: ...@@ -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 ...@@ -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
---------------------- ----------------------
......
...@@ -136,6 +136,12 @@ New Modules ...@@ -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
---- ----
......
...@@ -566,6 +566,12 @@ class FieldStorage: ...@@ -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)" % (
......
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 ...@@ -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 ...@@ -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()
...@@ -235,6 +235,9 @@ Core and Builtins ...@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment