bpo-30378: Fix the problem that SysLogHandler can't handle IPv6 addresses (#1676)
This commit is contained in:
parent
4e624ca50a
commit
0b4b57df96
|
@ -827,11 +827,26 @@ class SysLogHandler(logging.Handler):
|
|||
self.unixsocket = False
|
||||
if socktype is None:
|
||||
socktype = socket.SOCK_DGRAM
|
||||
self.socket = socket.socket(socket.AF_INET, socktype)
|
||||
if socktype == socket.SOCK_STREAM:
|
||||
self.socket.connect(address)
|
||||
host, port = address
|
||||
ress = socket.getaddrinfo(host, port, 0, socktype)
|
||||
if not ress:
|
||||
raise OSError("getaddrinfo returns an empty list")
|
||||
for res in ress:
|
||||
af, socktype, proto, _, sa = res
|
||||
err = sock = None
|
||||
try:
|
||||
sock = socket.socket(af, socktype, proto)
|
||||
if socktype == socket.SOCK_STREAM:
|
||||
sock.connect(sa)
|
||||
break
|
||||
except OSError as exc:
|
||||
err = exc
|
||||
if sock is not None:
|
||||
sock.close()
|
||||
if err is not None:
|
||||
raise err
|
||||
self.socket = sock
|
||||
self.socktype = socktype
|
||||
self.formatter = None
|
||||
|
||||
def _connect_unixsocket(self, address):
|
||||
use_socktype = self.socktype
|
||||
|
@ -870,7 +885,7 @@ class SysLogHandler(logging.Handler):
|
|||
priority = self.priority_names[priority]
|
||||
return (facility << 3) | priority
|
||||
|
||||
def close (self):
|
||||
def close(self):
|
||||
"""
|
||||
Closes the socket.
|
||||
"""
|
||||
|
|
|
@ -1678,7 +1678,7 @@ class SysLogHandlerTest(BaseTest):
|
|||
server.ready.wait()
|
||||
hcls = logging.handlers.SysLogHandler
|
||||
if isinstance(server.server_address, tuple):
|
||||
self.sl_hdlr = hcls(('localhost', server.port))
|
||||
self.sl_hdlr = hcls((server.server_address[0], server.port))
|
||||
else:
|
||||
self.sl_hdlr = hcls(server.server_address)
|
||||
self.log_output = ''
|
||||
|
@ -1738,6 +1738,24 @@ class UnixSysLogHandlerTest(SysLogHandlerTest):
|
|||
SysLogHandlerTest.tearDown(self)
|
||||
support.unlink(self.address)
|
||||
|
||||
@unittest.skipUnless(support.IPV6_ENABLED,
|
||||
'IPv6 support required for this test.')
|
||||
@unittest.skipUnless(threading, 'Threading required for this test.')
|
||||
class IPv6SysLogHandlerTest(SysLogHandlerTest):
|
||||
|
||||
"""Test for SysLogHandler with IPv6 host."""
|
||||
|
||||
server_class = TestUDPServer
|
||||
address = ('::1', 0)
|
||||
|
||||
def setUp(self):
|
||||
self.server_class.address_family = socket.AF_INET6
|
||||
super(IPv6SysLogHandlerTest, self).setUp()
|
||||
|
||||
def tearDown(self):
|
||||
self.server_class.address_family = socket.AF_INET
|
||||
super(IPv6SysLogHandlerTest, self).tearDown()
|
||||
|
||||
@unittest.skipUnless(threading, 'Threading required for this test.')
|
||||
class HTTPHandlerTest(BaseTest):
|
||||
"""Test for HTTPHandler."""
|
||||
|
@ -4404,7 +4422,7 @@ def test_main():
|
|||
QueueHandlerTest, ShutdownTest, ModuleLevelMiscTest, BasicConfigTest,
|
||||
LoggerAdapterTest, LoggerTest, SMTPHandlerTest, FileHandlerTest,
|
||||
RotatingFileHandlerTest, LastResortTest, LogRecordTest,
|
||||
ExceptionTest, SysLogHandlerTest, HTTPHandlerTest,
|
||||
ExceptionTest, SysLogHandlerTest, IPv6SysLogHandlerTest, HTTPHandlerTest,
|
||||
NTEventLogHandlerTest, TimedRotatingFileHandlerTest,
|
||||
UnixSocketHandlerTest, UnixDatagramHandlerTest, UnixSysLogHandlerTest,
|
||||
MiscTestCase
|
||||
|
|
Loading…
Reference in New Issue