From 19e9beb2db3d3e04e4dd08fafe5720fe0659a965 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 23 Apr 2012 10:08:14 -0400 Subject: [PATCH 1/7] sleep here --- Lib/test/test_thread.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index ae9a7d9527f..413889ad226 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -150,7 +150,7 @@ class ThreadRunningTests(BasicThreadTest): thread.start_new_thread(task, ()) started.acquire() while thread._count() > c: - pass + time.sleep(0.01) self.assertIn("Traceback", stderr.getvalue()) From eda1959d076caaa13a84fc6846b6acd017921ca4 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 23 Apr 2012 11:25:32 -0400 Subject: [PATCH 2/7] add Mark Shannon --- Misc/ACKS | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/ACKS b/Misc/ACKS index af0cd5f51cf..44194fd72d1 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -774,6 +774,7 @@ Jerry Seutter Denis Severson Ian Seyer Ha Shao +Mark Shannon Richard Shapiro Bruce Sherwood Alexander Shigin From 0267185088e407144cf3d20f8e6b346e5d109e75 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 23 Apr 2012 23:46:46 +0800 Subject: [PATCH 3/7] Fix for Issue13684 - httplib tunnel infinite loop --- Lib/httplib.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/httplib.py b/Lib/httplib.py index 13629c4a965..5d16e53c4c3 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -748,7 +748,11 @@ class HTTPConnection: line = response.fp.readline(_MAXLINE + 1) if len(line) > _MAXLINE: raise LineTooLong("header line") - if line == '\r\n': break + if not line: + # for sites which EOF without sending trailer + break + if line == '\r\n': + break def connect(self): From 4c20c4e198b0a87f94a814d891ef18bf2d49864a Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 23 Apr 2012 23:52:40 +0800 Subject: [PATCH 4/7] news for issue13684 --- Misc/NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index 20ca9684f57..eb0c9de2217 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,9 @@ Core and Builtins Library ------- +- Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites + which send EOF without trailing \r\n. + - Issue #14308: Fix an exception when a "dummy" thread is in the threading module's active list after a fork(). From c313b1d9b0a8afe47fdd58d4685fa3d19ab79e57 Mon Sep 17 00:00:00 2001 From: R David Murray Date: Mon, 23 Apr 2012 13:27:11 -0400 Subject: [PATCH 5/7] #14638: pydoc now treats non-str __name__ as None instead of raising Original patch by Peter Otten. --- Lib/pydoc.py | 3 ++- Lib/test/test_pydoc.py | 11 +++++++++++ Misc/NEWS | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 674af6aacf1..68ba21f30fc 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -1498,7 +1498,8 @@ def resolve(thing, forceload=0): raise ImportError, 'no Python documentation found for %r' % thing return object, thing else: - return thing, getattr(thing, '__name__', None) + name = getattr(thing, '__name__', None) + return thing, name if isinstance(name, str) else None def render_doc(thing, title='Python Library Documentation: %s', forceload=0): """Render text documentation, given an object or a path to an object.""" diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 59cbffe6d24..d95e7069ce1 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -249,6 +249,17 @@ class PyDocDocTest(unittest.TestCase): result, doc_loc = get_pydoc_text(xml.etree) self.assertEqual(doc_loc, "", "MODULE DOCS incorrectly includes a link") + def test_non_str_name(self): + # issue14638 + # Treat illegal (non-str) name like no name + class A: + __name__ = 42 + class B: + pass + adoc = pydoc.render_doc(A()) + bdoc = pydoc.render_doc(B()) + self.assertEqual(adoc.replace("A", "B"), bdoc) + def test_not_here(self): missing_module = "test.i_am_not_here" result = run_pydoc(missing_module) diff --git a/Misc/NEWS b/Misc/NEWS index eb0c9de2217..9f7cbdd0a5a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,9 @@ Core and Builtins Library ------- +- Issue #14638: pydoc now treats non-string __name__ values as if they + were missing, instead of raising an error. + - Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites which send EOF without trailing \r\n. From da999d29ab11b20c231ca85748ba387a43fe1f70 Mon Sep 17 00:00:00 2001 From: Sandro Tosi Date: Mon, 23 Apr 2012 19:44:51 +0200 Subject: [PATCH 6/7] Issue #14641: minor fixes to sockets Howto; patch by Dionysios Kalofonos --- Doc/howto/sockets.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst index f15d6597ea2..c4b3f71af75 100644 --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -156,7 +156,7 @@ I'm not going to talk about it here, except to warn you that you need to use there, you may wait forever for the reply, because the request may still be in your output buffer. -Now we come the major stumbling block of sockets - ``send`` and ``recv`` operate +Now we come to the major stumbling block of sockets - ``send`` and ``recv`` operate on the network buffers. They do not necessarily handle all the bytes you hand them (or expect from them), because their major focus is handling the network buffers. In general, they return when the associated network buffers have been @@ -167,7 +167,7 @@ been completely dealt with. When a ``recv`` returns 0 bytes, it means the other side has closed (or is in the process of closing) the connection. You will not receive any more data on this connection. Ever. You may be able to send data successfully; I'll talk -about that some on the next page. +more about this later. A protocol like HTTP uses a socket for only one transfer. The client sends a request, then reads a reply. That's it. The socket is discarded. This means that From 393b7b59a48b1cef11d76e9ca71cf8fa5972eda5 Mon Sep 17 00:00:00 2001 From: R David Murray Date: Mon, 23 Apr 2012 14:46:39 -0400 Subject: [PATCH 7/7] #14640: Fix typos/syntax in pyporting.rst. Patch by Dionysios Kalofonos. --- Doc/howto/pyporting.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index 309f3f7a3a7..3eca49685d5 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -39,7 +39,7 @@ code, it does mean you keep a rapid development process for you, the developer. Finally, you do have the option of :ref:`using 2to3 ` to translate Python 2 code into Python 3 code (with some manual help). This can take the form of branching your code and using 2to3 to start a Python 3 branch. You can -also have users perform the translation as installation time automatically so +also have users perform the translation at installation time automatically so that you only have to maintain a Python 2 codebase. Regardless of which approach you choose, porting is not as hard or @@ -234,7 +234,7 @@ You can avoid this disparity by always slicing at the size of a single element: ``b'py'[1:2]`` is ``'y'`` in Python 2 and ``b'y'`` in Python 3 (i.e., close enough). -You cannot concatenate bytes and strings in Python 3. But since in Python +You cannot concatenate bytes and strings in Python 3. But since Python 2 has bytes aliased to ``str``, it will succeed: ``b'a' + u'b'`` works in Python 2, but ``b'a' + 'b'`` in Python 3 is a :exc:`TypeError`. A similar issue also comes about when doing comparisons between bytes and strings. @@ -328,7 +328,7 @@ the bytes/string dichotomy. Because Python 2 allowed the ``str`` type to hold textual data, people have over the years been rather loose in their delineation of what ``str`` instances held text compared to bytes. In Python 3 you cannot be so care-free anymore and need to properly handle the difference. The key -handling this issue to make sure that **every** string literal in your +handling this issue is to make sure that **every** string literal in your Python 2 code is either syntactically of functionally marked as either bytes or text data. After this is done you then need to make sure your APIs are designed to either handle a specific type or made to be properly polymorphic. @@ -343,7 +343,7 @@ newer, this can be accomplished by marking bytes literals with a ``b`` prefix and then designating textual data with a ``u`` prefix or using the ``unicode_literals`` future statement. -If your project supports versions of Python pre-dating 2.6, then you should use +If your project supports versions of Python predating 2.6, then you should use the six_ project and its ``b()`` function to denote bytes literals. For text literals you can either use six's ``u()`` function or use a ``u`` prefix. @@ -439,7 +439,7 @@ happen to use the ``unicode(self).encode('utf8')`` idiom as the body of your There are two ways to solve this issue. One is to use a custom 2to3 fixer. The blog post at http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/ specifies how to do this. That will allow 2to3 to change all instances of ``def -__unicode(self): ...`` to ``def __str__(self): ...``. This does require you +__unicode(self): ...`` to ``def __str__(self): ...``. This does require that you define your ``__str__()`` method in Python 2 before your ``__unicode__()`` method.