mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
Support str and bytes for UNIX socket addresses (#1882)
Some systems report UNIX socket addresses as bytes while others will report it as a unicode string type. This patch improves socket type detection code to support both. Fix #1861
This commit is contained in:
parent
30554fdb4f
commit
e179dc2575
@ -71,11 +71,11 @@ class Message(object):
|
|||||||
secure_scheme_headers = cfg.secure_scheme_headers
|
secure_scheme_headers = cfg.secure_scheme_headers
|
||||||
elif isinstance(self.unreader, SocketUnreader):
|
elif isinstance(self.unreader, SocketUnreader):
|
||||||
remote_addr = self.unreader.sock.getpeername()
|
remote_addr = self.unreader.sock.getpeername()
|
||||||
if isinstance(remote_addr, tuple):
|
if self.unreader.sock.family in (socket.AF_INET, socket.AF_INET6):
|
||||||
remote_host = remote_addr[0]
|
remote_host = remote_addr[0]
|
||||||
if remote_host in cfg.forwarded_allow_ips:
|
if remote_host in cfg.forwarded_allow_ips:
|
||||||
secure_scheme_headers = cfg.secure_scheme_headers
|
secure_scheme_headers = cfg.secure_scheme_headers
|
||||||
elif isinstance(remote_addr, str):
|
elif self.unreader.sock.family == socket.AF_UNIX:
|
||||||
secure_scheme_headers = cfg.secure_scheme_headers
|
secure_scheme_headers = cfg.secure_scheme_headers
|
||||||
|
|
||||||
# Parse headers into key/value pairs paying attention
|
# Parse headers into key/value pairs paying attention
|
||||||
|
|||||||
@ -132,7 +132,7 @@ def _sock_type(addr):
|
|||||||
sock_type = TCP6Socket
|
sock_type = TCP6Socket
|
||||||
else:
|
else:
|
||||||
sock_type = TCPSocket
|
sock_type = TCPSocket
|
||||||
elif isinstance(addr, str):
|
elif isinstance(addr, (str, bytes)):
|
||||||
sock_type = UnixSocket
|
sock_type = UnixSocket
|
||||||
else:
|
else:
|
||||||
raise TypeError("Unable to create socket from: %r" % addr)
|
raise TypeError("Unable to create socket from: %r" % addr)
|
||||||
|
|||||||
@ -11,6 +11,27 @@ except ImportError:
|
|||||||
from gunicorn import sock
|
from gunicorn import sock
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch('os.stat')
|
||||||
|
def test_create_sockets_unix_bytes(stat):
|
||||||
|
conf = mock.Mock(address=[b'127.0.0.1:8000'])
|
||||||
|
log = mock.Mock()
|
||||||
|
with mock.patch.object(sock.UnixSocket, '__init__', lambda *args: None):
|
||||||
|
listeners = sock.create_sockets(conf, log)
|
||||||
|
assert len(listeners) == 1
|
||||||
|
print(type(listeners[0]))
|
||||||
|
assert isinstance(listeners[0], sock.UnixSocket)
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch('os.stat')
|
||||||
|
def test_create_sockets_unix_strings(stat):
|
||||||
|
conf = mock.Mock(address=['127.0.0.1:8000'])
|
||||||
|
log = mock.Mock()
|
||||||
|
with mock.patch.object(sock.UnixSocket, '__init__', lambda *args: None):
|
||||||
|
listeners = sock.create_sockets(conf, log)
|
||||||
|
assert len(listeners) == 1
|
||||||
|
assert isinstance(listeners[0], sock.UnixSocket)
|
||||||
|
|
||||||
|
|
||||||
def test_socket_close():
|
def test_socket_close():
|
||||||
listener1 = mock.Mock()
|
listener1 = mock.Mock()
|
||||||
listener1.getsockname.return_value = ('127.0.0.1', '80')
|
listener1.getsockname.return_value = ('127.0.0.1', '80')
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user