diff options
author | Christian Heimes <christian@cheimes.de> | 2008-02-23 16:23:06 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2008-02-23 16:23:06 (GMT) |
commit | 8640e749fd9f769f486268bebe340c9a35cca564 (patch) | |
tree | fd6168e9832696bf63426c7f50c8edd354df1a80 /Lib | |
parent | f697219e9cfe198c4fdfed31f0dbf26af5bdcae5 (diff) | |
download | cpython-8640e749fd9f769f486268bebe340c9a35cca564.zip cpython-8640e749fd9f769f486268bebe340c9a35cca564.tar.gz cpython-8640e749fd9f769f486268bebe340c9a35cca564.tar.bz2 |
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900,60902-60906,60908,60911-60917,60919-60920,60922,60926,60929-60931,60933-60935,60937,60939-60941,60943-60954,60959-60961,60963-60964,60966-60967,60971,60977,60979-60989 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r60980 | georg.brandl | 2008-02-23 16:02:28 +0100 (Sat, 23 Feb 2008) | 2 lines
#1492: allow overriding BaseHTTPServer's content type for error messages.
........
r60982 | georg.brandl | 2008-02-23 16:06:25 +0100 (Sat, 23 Feb 2008) | 2 lines
#2165: fix test_logging failure on some machines.
........
r60983 | facundo.batista | 2008-02-23 16:07:35 +0100 (Sat, 23 Feb 2008) | 6 lines
Issue 1089358. Adds the siginterrupt() function, that is just a
wrapper around the system call with the same name. Also added
test cases, doc changes and NEWS entry. Thanks Jason and Ralf
Schmitt.
........
r60984 | georg.brandl | 2008-02-23 16:11:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#2067: file.__exit__() now calls subclasses' close() method.
........
r60985 | georg.brandl | 2008-02-23 16:19:54 +0100 (Sat, 23 Feb 2008) | 2 lines
More difflib examples. Written for GHOP by Josip Dzolonga.
........
r60987 | andrew.kuchling | 2008-02-23 16:41:51 +0100 (Sat, 23 Feb 2008) | 1 line
#2072: correct documentation for .rpc_paths
........
r60988 | georg.brandl | 2008-02-23 16:43:48 +0100 (Sat, 23 Feb 2008) | 2 lines
#2161: Fix opcode name.
........
r60989 | andrew.kuchling | 2008-02-23 16:49:35 +0100 (Sat, 23 Feb 2008) | 2 lines
#1119331: ncurses will just call exit() if the terminal name isn't found.
Call setupterm() first so that we get a Python exception instead of just existing.
........
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/BaseHTTPServer.py | 11 | ||||
-rw-r--r-- | Lib/curses/__init__.py | 4 | ||||
-rw-r--r-- | Lib/test/test_logging.py | 39 | ||||
-rw-r--r-- | Lib/test/test_signal.py | 48 |
4 files changed, 71 insertions, 31 deletions
diff --git a/Lib/BaseHTTPServer.py b/Lib/BaseHTTPServer.py index f8a1138..fbb8108 100644 --- a/Lib/BaseHTTPServer.py +++ b/Lib/BaseHTTPServer.py @@ -77,7 +77,7 @@ import socket # For gethostbyaddr() import mimetools import SocketServer -# Default error message +# Default error message template DEFAULT_ERROR_MESSAGE = """\ <head> <title>Error response</title> @@ -90,6 +90,8 @@ DEFAULT_ERROR_MESSAGE = """\ </body> """ +DEFAULT_ERROR_CONTENT_TYPE = "text/html;charset=utf-8" + def _quote_html(html): return html.replace("&", "&").replace("<", "<").replace(">", ">") @@ -217,6 +219,9 @@ class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler): # where each string is of the form name[/version]. server_version = "BaseHTTP/" + __version__ + error_message_format = DEFAULT_ERROR_MESSAGE + error_content_type = DEFAULT_ERROR_CONTENT_TYPE + def parse_request(self): """Parse a request (internal). @@ -356,14 +361,12 @@ class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler): content = (self.error_message_format % {'code': code, 'message': _quote_html(message), 'explain': explain}) self.send_response(code, message) - self.send_header("Content-Type", "text/html;charset=utf-8") + self.send_header("Content-Type", self.error_content_type) self.send_header('Connection', 'close') self.end_headers() if self.command != 'HEAD' and code >= 200 and code not in (204, 304): self.wfile.write(content.encode('UTF-8', 'replace')) - error_message_format = DEFAULT_ERROR_MESSAGE - def send_response(self, code, message=None): """Send the response header and log the response code. diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py index aba540b..c3f2f25 100644 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@ -14,6 +14,7 @@ __revision__ = "$Id$" from _curses import * from curses.wrapper import wrapper +import os as _os # Some constants, most notably the ACS_* ones, are only added to the C # _curses module's dictionary after initscr() is called. (Some @@ -25,6 +26,9 @@ from curses.wrapper import wrapper def initscr(): import _curses, curses + # we call setupterm() here because it raises an error + # instead of calling exit() in error cases. + setupterm(term=_os.environ.get("TERM", "unknown")) stdscr = _curses.initscr() for key, value in _curses.__dict__.items(): if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index a31ad37..66aa9fa 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1828,8 +1828,7 @@ Test Main >>> import logging, logging.handlers, logging.config >>> from test import test_logging -XXX: The test is unstable! -#>>> test_logging.test_main_inner() +>>> test_logging.test_main_inner() ERR -> CRITICAL: Message 0 (via logrecv.tcp.ERR) ERR -> ERROR: Message 1 (via logrecv.tcp.ERR) INF -> CRITICAL: Message 2 (via logrecv.tcp.INF) @@ -2010,7 +2009,7 @@ class LogRecordSocketReceiver(ThreadingTCPServer): port=logging.handlers.DEFAULT_TCP_LOGGING_PORT, handler=LogRecordStreamHandler): ThreadingTCPServer.__init__(self, (host, port), handler) - self.abort = 0 + self.abort = False self.timeout = 1 def serve_until_stopped(self): @@ -2019,11 +2018,11 @@ class LogRecordSocketReceiver(ThreadingTCPServer): self.timeout) if rd: self.handle_request() + socketDataProcessed.set() # close the listen socket self.server_close() def process_request(self, request, client_address): - #import threading t = threading.Thread(target = self.finish_request, args = (request, client_address)) t.start() @@ -2108,28 +2107,18 @@ def test_main_inner(): rootLogger = logging.getLogger("") rootLogger.setLevel(logging.DEBUG) - # Find an unused port number - port = logging.handlers.DEFAULT_TCP_LOGGING_PORT - while port < logging.handlers.DEFAULT_TCP_LOGGING_PORT+100: - try: - tcpserver = LogRecordSocketReceiver(port=port) - except socket.error: - port += 1 - else: - break - else: - raise ImportError("Could not find unused port") - - - #Set up a handler such that all events are sent via a socket to the log - #receiver (logrecv). - #The handler will only be added to the rootLogger for some of the tests + tcpserver = LogRecordSocketReceiver(port=0) + port = tcpserver.socket.getsockname()[1] + + # Set up a handler such that all events are sent via a socket to the log + # receiver (logrecv). + # The handler will only be added to the rootLogger for some of the tests shdlr = logging.handlers.SocketHandler('localhost', port) rootLogger.addHandler(shdlr) - #Configure the logger for logrecv so events do not propagate beyond it. - #The sockLogger output is buffered in memory until the end of the test, - #and printed at the end. + # Configure the logger for logrecv so events do not propagate beyond it. + # The sockLogger output is buffered in memory until the end of the test, + # and printed at the end. sockOut = io.StringIO() sockLogger = logging.getLogger("logrecv") sockLogger.setLevel(logging.DEBUG) @@ -2158,9 +2147,9 @@ def test_main_inner(): finally: #wait for TCP receiver to terminate -# socketDataProcessed.wait() + socketDataProcessed.wait() # ensure the server dies - tcpserver.abort = 1 + tcpserver.abort = True for thread in threads: thread.join(2.0) print(sockOut.getvalue()) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 80a0bb2..03e8101 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -1,7 +1,7 @@ import unittest from test import test_support import signal -import os, sys, time +import os, sys, time, errno class HandlerBCalled(Exception): pass @@ -211,6 +211,50 @@ class WakeupSignalTests(unittest.TestCase): os.close(self.write) signal.signal(signal.SIGALRM, self.alrm) +class SiginterruptTest(unittest.TestCase): + signum = signal.SIGUSR1 + def readpipe_interrupted(self, cb): + r, w = os.pipe() + ppid = os.getpid() + pid = os.fork() + + oldhandler = signal.signal(self.signum, lambda x,y: None) + cb() + if pid==0: + # child code: sleep, kill, sleep. and then exit, + # which closes the pipe from which the parent process reads + try: + time.sleep(0.2) + os.kill(ppid, self.signum) + time.sleep(0.2) + finally: + os._exit(0) + + try: + os.close(w) + + try: + d=os.read(r, 1) + return False + except OSError as err: + if err.errno != errno.EINTR: + raise + return True + finally: + signal.signal(self.signum, oldhandler) + os.waitpid(pid, 0) + + def test_without_siginterrupt(self): + i=self.readpipe_interrupted(lambda: None) + self.assertEquals(i, True) + + def test_siginterrupt_on(self): + i=self.readpipe_interrupted(lambda: signal.siginterrupt(self.signum, 1)) + self.assertEquals(i, True) + + def test_siginterrupt_off(self): + i=self.readpipe_interrupted(lambda: signal.siginterrupt(self.signum, 0)) + self.assertEquals(i, False) def test_main(): if sys.platform[:3] in ('win', 'os2'): @@ -218,7 +262,7 @@ def test_main(): sys.platform) test_support.run_unittest(BasicSignalTests, InterProcessSignalTests, - WakeupSignalTests) + WakeupSignalTests, SiginterruptTest) if __name__ == "__main__": |