Issue #10281: nntplib now returns None for absent fields in the OVER/XOVER
response, instead of raising an exception.
This commit is contained in:
parent
33d144aa36
commit
4103bc09a4
|
@ -252,6 +252,8 @@ response indicates an error, the method raises one of the above exceptions.
|
||||||
(including headers and body)
|
(including headers and body)
|
||||||
* the ``:lines`` metadata: the number of lines in the article body
|
* the ``:lines`` metadata: the number of lines in the article body
|
||||||
|
|
||||||
|
The value of each item is either a string, or :const:`None` if not present.
|
||||||
|
|
||||||
It is advisable to use the :func:`decode_header` function on header
|
It is advisable to use the :func:`decode_header` function on header
|
||||||
values when they may contain non-ASCII characters::
|
values when they may contain non-ASCII characters::
|
||||||
|
|
||||||
|
|
|
@ -205,11 +205,12 @@ def _parse_overview(lines, fmt, data_process_func=None):
|
||||||
is_metadata = field_name.startswith(':')
|
is_metadata = field_name.startswith(':')
|
||||||
if i >= n_defaults and not is_metadata:
|
if i >= n_defaults and not is_metadata:
|
||||||
# Non-default header names are included in full in the response
|
# Non-default header names are included in full in the response
|
||||||
h = field_name + ":"
|
# (unless the field is totally empty)
|
||||||
if token[:len(h)].lower() != h:
|
h = field_name + ": "
|
||||||
|
if token and token[:len(h)].lower() != h:
|
||||||
raise NNTPDataError("OVER/XOVER response doesn't include "
|
raise NNTPDataError("OVER/XOVER response doesn't include "
|
||||||
"names of additional headers")
|
"names of additional headers")
|
||||||
token = token[len(h):].lstrip(" ")
|
token = token[len(h):] if token else None
|
||||||
fields[fmt[i]] = token
|
fields[fmt[i]] = token
|
||||||
overview.append((article_number, fields))
|
overview.append((article_number, fields))
|
||||||
return overview
|
return overview
|
||||||
|
|
|
@ -457,7 +457,7 @@ class NNTPv1Handler:
|
||||||
"\tThu, 22 Jul 2010 09:14:14 -0400"
|
"\tThu, 22 Jul 2010 09:14:14 -0400"
|
||||||
"\t<A29863FA-F388-40C3-AA25-0FD06B09B5BF@gmail.com>"
|
"\t<A29863FA-F388-40C3-AA25-0FD06B09B5BF@gmail.com>"
|
||||||
"\t\t6683\t16"
|
"\t\t6683\t16"
|
||||||
"\tXref: news.gmane.org gmane.comp.python.authors:58"
|
"\t"
|
||||||
"\n"
|
"\n"
|
||||||
# An UTF-8 overview line from fr.comp.lang.python
|
# An UTF-8 overview line from fr.comp.lang.python
|
||||||
"59\tRe: Message d'erreur incompréhensible (par moi)"
|
"59\tRe: Message d'erreur incompréhensible (par moi)"
|
||||||
|
@ -824,6 +824,8 @@ class NNTPv1v2TestsMixin:
|
||||||
":lines": "16",
|
":lines": "16",
|
||||||
"xref": "news.gmane.org gmane.comp.python.authors:57"
|
"xref": "news.gmane.org gmane.comp.python.authors:57"
|
||||||
})
|
})
|
||||||
|
art_num, over = overviews[1]
|
||||||
|
self.assertEqual(over["xref"], None)
|
||||||
art_num, over = overviews[2]
|
art_num, over = overviews[2]
|
||||||
self.assertEqual(over["subject"],
|
self.assertEqual(over["subject"],
|
||||||
"Re: Message d'erreur incompréhensible (par moi)")
|
"Re: Message d'erreur incompréhensible (par moi)")
|
||||||
|
@ -1028,6 +1030,29 @@ class MiscTests(unittest.TestCase):
|
||||||
':lines': '17',
|
':lines': '17',
|
||||||
'xref': 'news.example.com misc.test:3000363',
|
'xref': 'news.example.com misc.test:3000363',
|
||||||
})
|
})
|
||||||
|
# Second example; here the "Xref" field is totally absent (including
|
||||||
|
# the header name) and comes out as None
|
||||||
|
lines = [
|
||||||
|
'3000234\tI am just a test article\t"Demo User" '
|
||||||
|
'<nobody@example.com>\t6 Oct 1998 04:38:40 -0500\t'
|
||||||
|
'<45223423@example.com>\t<45454@example.net>\t1234\t'
|
||||||
|
'17\t\t',
|
||||||
|
]
|
||||||
|
overview = nntplib._parse_overview(lines, fmt)
|
||||||
|
(art_num, fields), = overview
|
||||||
|
self.assertEqual(fields['xref'], None)
|
||||||
|
# Third example; the "Xref" is an empty string, while "references"
|
||||||
|
# is a single space.
|
||||||
|
lines = [
|
||||||
|
'3000234\tI am just a test article\t"Demo User" '
|
||||||
|
'<nobody@example.com>\t6 Oct 1998 04:38:40 -0500\t'
|
||||||
|
'<45223423@example.com>\t \t1234\t'
|
||||||
|
'17\tXref: \t',
|
||||||
|
]
|
||||||
|
overview = nntplib._parse_overview(lines, fmt)
|
||||||
|
(art_num, fields), = overview
|
||||||
|
self.assertEqual(fields['references'], ' ')
|
||||||
|
self.assertEqual(fields['xref'], '')
|
||||||
|
|
||||||
def test_parse_datetime(self):
|
def test_parse_datetime(self):
|
||||||
def gives(a, b, *c):
|
def gives(a, b, *c):
|
||||||
|
|
|
@ -59,6 +59,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #10281: nntplib now returns None for absent fields in the OVER/XOVER
|
||||||
|
response, instead of raising an exception.
|
||||||
|
|
||||||
- wsgiref now implements and validates PEP 3333, rather than an experimental
|
- wsgiref now implements and validates PEP 3333, rather than an experimental
|
||||||
extension of PEP 333. (Note: earlier versions of Python 3.x may have
|
extension of PEP 333. (Note: earlier versions of Python 3.x may have
|
||||||
incorrectly validated some non-compliant applications as WSGI compliant;
|
incorrectly validated some non-compliant applications as WSGI compliant;
|
||||||
|
|
Loading…
Reference in New Issue