diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-07-02 17:30:14 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-07-02 17:30:14 (GMT) |
commit | dcf97b98ec5cad972b3a8b4989001c45da87d0ea (patch) | |
tree | e75bec19409f4d702ad01b9b7bded5991c9b88f7 /Lib | |
parent | f9c98b48bd7d0017d24cd076e2bc879d112b0a7d (diff) | |
download | cpython-dcf97b98ec5cad972b3a8b4989001c45da87d0ea.zip cpython-dcf97b98ec5cad972b3a8b4989001c45da87d0ea.tar.gz cpython-dcf97b98ec5cad972b3a8b4989001c45da87d0ea.tar.bz2 |
Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r64434 | andrew.kuchling | 2008-06-20 18:13:58 -0500 (Fri, 20 Jun 2008) | 1 line
Remove request for e-mail; it's unlikely these classes will be saved
........
r64435 | andrew.kuchling | 2008-06-20 18:14:32 -0500 (Fri, 20 Jun 2008) | 1 line
Grammar fixes
........
r64440 | andrew.kuchling | 2008-06-21 08:29:12 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring typo
........
r64441 | andrew.kuchling | 2008-06-21 08:47:20 -0500 (Sat, 21 Jun 2008) | 1 line
Use repr() for bad input strings; this makes the empty string or binary characters more visible
........
r64442 | andrew.kuchling | 2008-06-21 08:48:38 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring correction
........
r64443 | georg.brandl | 2008-06-21 09:26:19 -0500 (Sat, 21 Jun 2008) | 2 lines
Documentation fix.
........
r64445 | facundo.batista | 2008-06-21 12:30:06 -0500 (Sat, 21 Jun 2008) | 3 lines
Reviewed and updated the documentation. Fixes #3017.
........
r64447 | facundo.batista | 2008-06-21 13:58:04 -0500 (Sat, 21 Jun 2008) | 6 lines
Now a from submitted via POST that also has a query string
will contain both FieldStorage and MiniFieldStorage items.
Fixes #1817.
........
r64448 | facundo.batista | 2008-06-21 14:48:19 -0500 (Sat, 21 Jun 2008) | 5 lines
In the deprecated functions I added an alert to review
specially a section of the subprocess documentation
that helps with the replacing of those functionss.
........
r64450 | georg.brandl | 2008-06-22 04:05:29 -0500 (Sun, 22 Jun 2008) | 2 lines
Turn section references into proper cross-references.
........
r64452 | facundo.batista | 2008-06-22 08:36:20 -0500 (Sun, 22 Jun 2008) | 5 lines
Issue #2722. Now the char buffer to support the path string has
not fixed length, it mallocs memory if needed. As a result, we
don't have a maximum for the getcwd() method.
........
r64455 | facundo.batista | 2008-06-22 10:27:10 -0500 (Sun, 22 Jun 2008) | 4 lines
Issue 3164. Small fix to don't repeat a comparation
without necessity.
........
r64461 | georg.brandl | 2008-06-22 13:11:52 -0500 (Sun, 22 Jun 2008) | 2 lines
#3085: Fix syntax error.
........
r64464 | georg.brandl | 2008-06-22 13:31:54 -0500 (Sun, 22 Jun 2008) | 2 lines
Expand docstrings of sqlite3 functions.
........
r64466 | georg.brandl | 2008-06-22 14:07:59 -0500 (Sun, 22 Jun 2008) | 2 lines
Write out "phi" consistently.
........
r64468 | facundo.batista | 2008-06-22 14:35:24 -0500 (Sun, 22 Jun 2008) | 4 lines
Just returning nothing instead of rising TestSkipped, because
it makes the test fail in the trunk.loewis-sun buildbot.
........
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) |