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)::
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
----------------------
......
......@@ -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
----
......
......@@ -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)" % (
......
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()
......@@ -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.
......
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