wsgi: UNIX socket address was trimmed in "wsgi starting" log; Thanks to Ihar Hrachyshka

For UNIX sockets, getsockname() returns a string, not a 2-tuple, that
represents the file path that is assigned to it. That's why we need a
special handling for the socket type.

https://github.com/eventlet/eventlet/issues/235
This commit is contained in:
Sergey Shepelev
2015-06-02 20:10:39 +03:00
parent ed06553330
commit 3ba7b02dfa
3 changed files with 37 additions and 13 deletions

View File

@@ -120,3 +120,4 @@ Thanks To
* Tim Simmons, Use _socket_nodns and select in dnspython support * Tim Simmons, Use _socket_nodns and select in dnspython support
* Antonio Cuni, fix fd double close on PyPy * Antonio Cuni, fix fd double close on PyPy
* Seyeong Kim * Seyeong Kim
* Ihar Hrachyshka

View File

@@ -711,6 +711,24 @@ except ImportError:
ACCEPT_ERRNO = set((errno.EPIPE, errno.EBADF, errno.ECONNRESET)) ACCEPT_ERRNO = set((errno.EPIPE, errno.EBADF, errno.ECONNRESET))
def socket_repr(sock):
scheme = 'http'
if hasattr(sock, 'do_handshake'):
scheme = 'https'
name = sock.getsockname()
if sock.family == socket.AF_INET:
hier_part = '//{0}:{1}'.format(*name)
elif sock.family == socket.AF_INET6:
hier_part = '//[{0}]:{1}'.format(*name[:2])
elif sock.family == socket.AF_UNIX:
hier_part = name
else:
hier_part = repr(name)
return scheme + ':' + hier_part
def server(sock, site, def server(sock, site,
log=None, log=None,
environ=None, environ=None,
@@ -805,19 +823,8 @@ def server(sock, site,
else: else:
pool = greenpool.GreenPool(max_size) pool = greenpool.GreenPool(max_size)
try: try:
host, port = sock.getsockname()[:2] serv.log.info("(%s) wsgi starting up on %s" % (
port = ':%s' % (port, ) serv.pid, socket_repr(sock)))
if hasattr(sock, 'do_handshake'):
scheme = 'https'
if port == ':443':
port = ''
else:
scheme = 'http'
if port == ':80':
port = ''
serv.log.info("(%s) wsgi starting up on %s://%s%s/" % (
serv.pid, scheme, host, port))
while is_accepting: while is_accepting:
try: try:
client_socket = sock.accept() client_socket = sock.accept()

View File

@@ -2,9 +2,11 @@ import cgi
import collections import collections
import errno import errno
import os import os
import shutil
import signal import signal
import socket import socket
import sys import sys
import tempfile
import traceback import traceback
import unittest import unittest
@@ -1488,6 +1490,20 @@ class TestHttpd(_TestBase):
self.assertEqual(result.headers_lower[random_case_header[0].lower()], random_case_header[1]) self.assertEqual(result.headers_lower[random_case_header[0].lower()], random_case_header[1])
self.assertEqual(result.headers_original[random_case_header[0]], random_case_header[1]) self.assertEqual(result.headers_original[random_case_header[0]], random_case_header[1])
def test_log_unix_address(self):
tempdir = tempfile.mkdtemp('eventlet_test_log_unix_address')
path = ''
try:
sock = eventlet.listen(tempdir + '/socket', socket.AF_UNIX)
path = sock.getsockname()
log = six.StringIO()
self.spawn_server(sock=sock, log=log)
eventlet.sleep(0) # need to enter server loop
assert 'http:' + path in log.getvalue()
finally:
shutil.rmtree(tempdir)
def read_headers(sock): def read_headers(sock):
fd = sock.makefile('rb') fd = sock.makefile('rb')