diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/ast.py | 2 | ||||
-rwxr-xr-x | Lib/cgi.py | 11 | ||||
-rwxr-xr-x | Lib/fractions.py | 2 | ||||
-rw-r--r-- | Lib/test/test_cgi.py | 87 | ||||
-rw-r--r-- | Lib/test/test_fractions.py | 18 | ||||
-rw-r--r-- | Lib/test/test_posix.py | 39 |
6 files changed, 148 insertions, 11 deletions
@@ -73,7 +73,7 @@ def dump(node, annotate_fields=True, include_attributes=False): debugging purposes. The returned string will show the names and the values for fields. This makes the code impossible to evaluate, so if evaluation is wanted *annotate_fields* must be set to False. Attributes such as line - numbers and column offsets are dumped by default. If this is wanted, + numbers and column offsets are not dumped by default. If this is wanted, *include_attributes* can be set to True. """ def _format(node): @@ -449,6 +449,7 @@ class FieldStorage: self.strict_parsing = strict_parsing if 'REQUEST_METHOD' in environ: method = environ['REQUEST_METHOD'].upper() + self.qs_on_post = None if method == 'GET' or method == 'HEAD': if 'QUERY_STRING' in environ: qs = environ['QUERY_STRING'] @@ -467,6 +468,8 @@ class FieldStorage: headers['content-type'] = "application/x-www-form-urlencoded" if 'CONTENT_TYPE' in environ: headers['content-type'] = environ['CONTENT_TYPE'] + if 'QUERY_STRING' in environ: + self.qs_on_post = environ['QUERY_STRING'] if 'CONTENT_LENGTH' in environ: headers['content-length'] = environ['CONTENT_LENGTH'] self.fp = fp or sys.stdin @@ -618,6 +621,8 @@ class FieldStorage: def read_urlencoded(self): """Internal: read data in query string format.""" qs = self.fp.read(self.length) + if self.qs_on_post: + qs += '&' + self.qs_on_post self.list = list = [] for key, value in parse_qsl(qs, self.keep_blank_values, self.strict_parsing): @@ -632,6 +637,12 @@ class FieldStorage: if not valid_boundary(ib): raise ValueError('Invalid boundary in multipart form: %r' % (ib,)) self.list = [] + if self.qs_on_post: + for key, value in parse_qsl(self.qs_on_post, self.keep_blank_values, + self.strict_parsing): + self.list.append(MiniFieldStorage(key, value)) + FieldStorageClass = None + klass = self.FieldStorageClass or self.__class__ parser = email.parser.FeedParser() # Create bogus content-type header for proper multipart parsing diff --git a/Lib/fractions.py b/Lib/fractions.py index 670c8eb..d3fd920 100755 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -68,7 +68,7 @@ class Fraction(numbers.Rational): input = numerator m = _RATIONAL_FORMAT.match(input) if m is None: - raise ValueError('Invalid literal for Fraction: ' + input) + raise ValueError('Invalid literal for Fraction: %r' % input) numerator = m.group('num') decimal = m.group('decimal') if decimal: diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py index 0d9b227..9381a3c 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -126,6 +126,16 @@ def first_elts(list): def first_second_elts(list): return [(p[0], p[1][0]) for p in list] +def gen_result(data, environ): + fake_stdin = StringIO(data) + fake_stdin.seek(0) + form = cgi.FieldStorage(fp=fake_stdin, environ=environ) + + result = {} + for k, v in dict(form).items(): + result[k] = type(v) is list and form.getlist(k) or v.value + + return result class CgiTests(unittest.TestCase): @@ -241,6 +251,83 @@ Content-Disposition: form-data; name="submit" got = getattr(fs.list[x], k) self.assertEquals(got, exp) + _qs_result = { + 'key1': 'value1', + 'key2': ['value2x', 'value2y'], + 'key3': 'value3', + 'key4': 'value4' + } + def testQSAndUrlEncode(self): + data = "key2=value2x&key3=value3&key4=value4" + environ = { + 'CONTENT_LENGTH': str(len(data)), + 'CONTENT_TYPE': 'application/x-www-form-urlencoded', + 'QUERY_STRING': 'key1=value1&key2=value2y', + 'REQUEST_METHOD': 'POST', + } + v = gen_result(data, environ) + self.assertEqual(self._qs_result, v) + + def testQSAndFormData(self): + data = """ +---123 +Content-Disposition: form-data; name="key2" + +value2y +---123 +Content-Disposition: form-data; name="key3" + +value3 +---123 +Content-Disposition: form-data; name="key4" + +value4 +---123-- +""" + environ = { + 'CONTENT_LENGTH': str(len(data)), + 'CONTENT_TYPE': 'multipart/form-data; boundary=-123', + 'QUERY_STRING': 'key1=value1&key2=value2x', + 'REQUEST_METHOD': 'POST', + } + v = gen_result(data, environ) + self.assertEqual(self._qs_result, v) + + def testQSAndFormDataFile(self): + data = """ +---123 +Content-Disposition: form-data; name="key2" + +value2y +---123 +Content-Disposition: form-data; name="key3" + +value3 +---123 +Content-Disposition: form-data; name="key4" + +value4 +---123 +Content-Disposition: form-data; name="upload"; filename="fake.txt" +Content-Type: text/plain + +this is the content of the fake file + +---123-- +""" + environ = { + 'CONTENT_LENGTH': str(len(data)), + 'CONTENT_TYPE': 'multipart/form-data; boundary=-123', + 'QUERY_STRING': 'key1=value1&key2=value2x', + 'REQUEST_METHOD': 'POST', + } + result = self._qs_result.copy() + result.update({ + 'upload': 'this is the content of the fake file' + }) + v = gen_result(data, environ) + self.assertEqual(result, v) + def test_main(): run_unittest(CgiTests) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index d06c206..97e91ce 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -83,38 +83,38 @@ class FractionTest(unittest.TestCase): ZeroDivisionError, "Fraction(3, 0)", F, "3/0") self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: 3/", + ValueError, "Invalid literal for Fraction: '3/'", F, "3/") self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: 3 /2", + ValueError, "Invalid literal for Fraction: '3 /2'", F, "3 /2") self.assertRaisesMessage( # Denominators don't need a sign. - ValueError, "Invalid literal for Fraction: 3/+2", + ValueError, "Invalid literal for Fraction: '3/+2'", F, "3/+2") self.assertRaisesMessage( # Imitate float's parsing. - ValueError, "Invalid literal for Fraction: + 3/2", + ValueError, "Invalid literal for Fraction: '+ 3/2'", F, "+ 3/2") self.assertRaisesMessage( # Avoid treating '.' as a regex special character. - ValueError, "Invalid literal for Fraction: 3a2", + ValueError, "Invalid literal for Fraction: '3a2'", F, "3a2") self.assertRaisesMessage( # Only parse ordinary decimals, not scientific form. - ValueError, "Invalid literal for Fraction: 3.2e4", + ValueError, "Invalid literal for Fraction: '3.2e4'", F, "3.2e4") self.assertRaisesMessage( # Don't accept combinations of decimals and rationals. - ValueError, "Invalid literal for Fraction: 3/7.2", + ValueError, "Invalid literal for Fraction: '3/7.2'", F, "3/7.2") self.assertRaisesMessage( # Don't accept combinations of decimals and rationals. - ValueError, "Invalid literal for Fraction: 3.2/7", + ValueError, "Invalid literal for Fraction: '3.2/7'", F, "3.2/7") self.assertRaisesMessage( # Allow 3. and .3, but not . - ValueError, "Invalid literal for Fraction: .", + ValueError, "Invalid literal for Fraction: '.'", F, ".") def testImmutable(self): diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index f16abb2..b7ce71e 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -10,6 +10,7 @@ except ImportError: import time import os import pwd +import shutil import unittest import warnings warnings.filterwarnings('ignore', '.* potential security risk .*', @@ -225,6 +226,44 @@ class PosixTester(unittest.TestCase): self.assertEqual(type(k), str) self.assertEqual(type(v), str) + def test_getcwd_long_pathnames(self): + if hasattr(posix, 'getcwd'): + dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef' + curdir = os.getcwd() + base_path = os.path.abspath(support.TESTFN) + '.getcwd' + + try: + os.mkdir(base_path) + os.chdir(base_path) + except: +# Just returning nothing instead of the TestSkipped exception, +# because the test results in Error in that case. +# Is that ok? +# raise support.TestSkipped, "cannot create directory for testing" + return + + def _create_and_do_getcwd(dirname, current_path_length = 0): + try: + os.mkdir(dirname) + except: + raise support.TestSkipped("mkdir cannot create directory sufficiently deep for getcwd test") + + os.chdir(dirname) + try: + os.getcwd() + if current_path_length < 1027: + _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1) + finally: + os.chdir('..') + os.rmdir(dirname) + + _create_and_do_getcwd(dirname) + + finally: + shutil.rmtree(base_path) + os.chdir(curdir) + + def test_main(): support.run_unittest(PosixTester) |