Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r81465 | georg.brandl | 2010-05-22 06:29:19 -0500 (Sat, 22 May 2010) | 2 lines

  Issue #3924: Ignore cookies with invalid "version" field in cookielib.
........
  r81466 | georg.brandl | 2010-05-22 06:31:16 -0500 (Sat, 22 May 2010) | 1 line

  Underscore the name of an internal utility function.
........
  r81468 | georg.brandl | 2010-05-22 06:43:25 -0500 (Sat, 22 May 2010) | 1 line

  #8635: document enumerate() start parameter in docstring.
........
  r81679 | benjamin.peterson | 2010-06-03 16:21:03 -0500 (Thu, 03 Jun 2010) | 1 line

  use a set for membership testing
........
  r81735 | michael.foord | 2010-06-05 06:46:59 -0500 (Sat, 05 Jun 2010) | 1 line

  Extract error message truncating into a method (unittest.TestCase._truncateMessage).
........
  r81760 | michael.foord | 2010-06-05 14:38:42 -0500 (Sat, 05 Jun 2010) | 1 line

  Issue 8302. SkipTest exception is setUpClass or setUpModule is now reported as a skip rather than an error.
........
  r81868 | benjamin.peterson | 2010-06-09 14:45:04 -0500 (Wed, 09 Jun 2010) | 1 line

  fix code formatting
........
  r82183 | benjamin.peterson | 2010-06-23 15:29:26 -0500 (Wed, 23 Jun 2010) | 1 line

  cpython only gc tests
........
This commit is contained in:
Benjamin Peterson 2010-06-27 21:45:24 +00:00
parent 63eebe5318
commit 3e5cd1d04e
7 changed files with 43 additions and 14 deletions

View File

@ -436,6 +436,13 @@ def join_header_words(lists):
if attr: headers.append("; ".join(attr)) if attr: headers.append("; ".join(attr))
return ", ".join(headers) return ", ".join(headers)
def strip_quotes(text):
if text.startswith('"'):
text = text[1:]
if text.endswith('"'):
text = text[:-1]
return text
def parse_ns_headers(ns_headers): def parse_ns_headers(ns_headers):
"""Ad-hoc parser for Netscape protocol cookie-attributes. """Ad-hoc parser for Netscape protocol cookie-attributes.
@ -453,7 +460,7 @@ def parse_ns_headers(ns_headers):
""" """
known_attrs = ("expires", "domain", "path", "secure", known_attrs = ("expires", "domain", "path", "secure",
# RFC 2109 attrs (may turn up in Netscape cookies, too) # RFC 2109 attrs (may turn up in Netscape cookies, too)
"port", "max-age") "version", "port", "max-age")
result = [] result = []
for ns_header in ns_headers: for ns_header in ns_headers:
@ -473,12 +480,11 @@ def parse_ns_headers(ns_headers):
k = lc k = lc
if k == "version": if k == "version":
# This is an RFC 2109 cookie. # This is an RFC 2109 cookie.
v = strip_quotes(v)
version_set = True version_set = True
if k == "expires": if k == "expires":
# convert expires date to seconds since epoch # convert expires date to seconds since epoch
if v.startswith('"'): v = v[1:] v = http2time(strip_quotes(v)) # None if invalid
if v.endswith('"'): v = v[:-1]
v = http2time(v) # None if invalid
pairs.append((k, v)) pairs.append((k, v))
if pairs: if pairs:
@ -1446,7 +1452,11 @@ class CookieJar:
# set the easy defaults # set the easy defaults
version = standard.get("version", None) version = standard.get("version", None)
if version is not None: version = int(version) if version is not None:
try:
version = int(version)
except ValueError:
return None # invalid version, ignore cookie
secure = standard.get("secure", False) secure = standard.get("secure", False)
# (discard is also set if expires is Absent) # (discard is also set if expires is Absent)
discard = standard.get("discard", False) discard = standard.get("discard", False)

View File

@ -273,12 +273,12 @@ def getsitepackages():
environment, and will return a list of full paths. environment, and will return a list of full paths.
""" """
sitepackages = [] sitepackages = []
seen = [] seen = set()
for prefix in PREFIXES: for prefix in PREFIXES:
if not prefix or prefix in seen: if not prefix or prefix in seen:
continue continue
seen.append(prefix) seen.add(prefix)
if sys.platform in ('os2emx', 'riscos'): if sys.platform in ('os2emx', 'riscos'):
sitepackages.append(os.path.join(prefix, "Lib", "site-packages")) sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))

View File

@ -664,6 +664,7 @@ class DictTest(unittest.TestCase):
gc.collect() gc.collect()
self.assertTrue(gc.is_tracked(t), t) self.assertTrue(gc.is_tracked(t), t)
@support.cpython_only
def test_track_literals(self): def test_track_literals(self):
# Test GC-optimization of dict literals # Test GC-optimization of dict literals
x, y, z, w = 1.5, "a", (1, None), [] x, y, z, w = 1.5, "a", (1, None), []
@ -681,6 +682,7 @@ class DictTest(unittest.TestCase):
self._tracked({1: {}}) self._tracked({1: {}})
self._tracked({1: set()}) self._tracked({1: set()})
@support.cpython_only
def test_track_dynamic(self): def test_track_dynamic(self):
# Test GC-optimization of dynamically-created dicts # Test GC-optimization of dynamically-created dicts
class MyObject(object): class MyObject(object):
@ -744,6 +746,7 @@ class DictTest(unittest.TestCase):
d.update([(x, y), (z, w)]) d.update([(x, y), (z, w)])
self._tracked(d) self._tracked(d)
@support.cpython_only
def test_track_subtypes(self): def test_track_subtypes(self):
# Dict subtypes are always tracked # Dict subtypes are always tracked
class MyDict(dict): class MyDict(dict):

View File

@ -97,6 +97,7 @@ class DateTimeTests(TestCase):
class HeaderTests(TestCase): class HeaderTests(TestCase):
def test_parse_ns_headers(self): def test_parse_ns_headers(self):
# quotes should be stripped # quotes should be stripped
expected = [[('foo', 'bar'), ('expires', 2209069412), ('version', '0')]] expected = [[('foo', 'bar'), ('expires', 2209069412), ('version', '0')]]
@ -106,6 +107,16 @@ class HeaderTests(TestCase):
]: ]:
self.assertEquals(parse_ns_headers([hdr]), expected) self.assertEquals(parse_ns_headers([hdr]), expected)
def test_parse_ns_headers_version(self):
# quotes should be stripped
expected = [[('foo', 'bar'), ('version', '1')]]
for hdr in [
'foo=bar; version="1"',
'foo=bar; Version="1"',
]:
self.assertEquals(parse_ns_headers([hdr]), expected)
def test_parse_ns_headers_special_names(self): def test_parse_ns_headers_special_names(self):
# names such as 'expires' are not special in first name=value pair # names such as 'expires' are not special in first name=value pair
# of Set-Cookie: header # of Set-Cookie: header
@ -1020,6 +1031,8 @@ class CookieTests(TestCase):
["Set-Cookie2: a=foo; path=/; Version=1; domain"], ["Set-Cookie2: a=foo; path=/; Version=1; domain"],
# bad max-age # bad max-age
["Set-Cookie: b=foo; max-age=oops"], ["Set-Cookie: b=foo; max-age=oops"],
# bad version
["Set-Cookie: b=foo; version=spam"],
]: ]:
c = cookiejar_from_cookie_headers(headers) c = cookiejar_from_cookie_headers(headers)
# these bad cookies shouldn't be set # these bad cookies shouldn't be set

View File

@ -159,12 +159,13 @@ enum_next(enumobject *en)
} }
PyDoc_STRVAR(enum_doc, PyDoc_STRVAR(enum_doc,
"enumerate(iterable) -> iterator for index, value of iterable\n" "enumerate(iterable[, start]) -> iterator for index, value of iterable\n"
"\n" "\n"
"Return an enumerate object. iterable must be another object that supports\n" "Return an enumerate object. iterable must be another object that supports\n"
"iteration. The enumerate object yields pairs containing a count (from\n" "iteration. The enumerate object yields pairs containing a count (from\n"
"zero) and a value yielded by the iterable argument. enumerate is useful\n" "start, which defaults to zero) and a value yielded by the iterable argument.\n"
"for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ..."); "enumerate is useful for obtaining an indexed list:\n"
" (0, seq[0]), (1, seq[1]), (2, seq[2]), ...");
PyTypeObject PyEnum_Type = { PyTypeObject PyEnum_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT(&PyType_Type, 0)

View File

@ -732,8 +732,9 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
{ {
int i, result; int i, result;
PyObject *s, *l = PyTuple_New(num_fields); PyObject *s, *l = PyTuple_New(num_fields);
if (!l) return 0; if (!l)
for(i = 0; i < num_fields; i++) { return 0;
for (i = 0; i < num_fields; i++) {
s = PyUnicode_FromString(attrs[i]); s = PyUnicode_FromString(attrs[i]);
if (!s) { if (!s) {
Py_DECREF(l); Py_DECREF(l);

View File

@ -537,8 +537,9 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
{ {
int i, result; int i, result;
PyObject *s, *l = PyTuple_New(num_fields); PyObject *s, *l = PyTuple_New(num_fields);
if (!l) return 0; if (!l)
for(i = 0; i < num_fields; i++) { return 0;
for (i = 0; i < num_fields; i++) {
s = PyUnicode_FromString(attrs[i]); s = PyUnicode_FromString(attrs[i]);
if (!s) { if (!s) {
Py_DECREF(l); Py_DECREF(l);