summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Shepelev <temotor@gmail.com>2015-06-02 20:10:39 +0300
committerSergey Shepelev <temotor@gmail.com>2015-06-02 20:34:13 +0300
commit3ba7b02dfacb00e51dcad8097c3854f51c2b7d71 (patch)
treef6cf2de05ff945a1933ab7d674b6344df3e0ebcc
parented0655333007fe97624b745e92deb407d192022c (diff)
downloadeventlet-gh-235.tar.gz
wsgi: UNIX socket address was trimmed in "wsgi starting" log; Thanks to Ihar Hrachyshkagh-235
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
-rw-r--r--AUTHORS1
-rw-r--r--eventlet/wsgi.py33
-rw-r--r--tests/wsgi_test.py16
3 files changed, 37 insertions, 13 deletions
diff --git a/AUTHORS b/AUTHORS
index c57f010..dd080b2 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -120,3 +120,4 @@ Thanks To
* Tim Simmons, Use _socket_nodns and select in dnspython support
* Antonio Cuni, fix fd double close on PyPy
* Seyeong Kim
+* Ihar Hrachyshka
diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py
index 7258277..64de9de 100644
--- a/eventlet/wsgi.py
+++ b/eventlet/wsgi.py
@@ -711,6 +711,24 @@ except ImportError:
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,
log=None,
environ=None,
@@ -805,19 +823,8 @@ def server(sock, site,
else:
pool = greenpool.GreenPool(max_size)
try:
- host, port = sock.getsockname()[:2]
- port = ':%s' % (port, )
- 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))
+ serv.log.info("(%s) wsgi starting up on %s" % (
+ serv.pid, socket_repr(sock)))
while is_accepting:
try:
client_socket = sock.accept()
diff --git a/tests/wsgi_test.py b/tests/wsgi_test.py
index d5cea18..a37f3a1 100644
--- a/tests/wsgi_test.py
+++ b/tests/wsgi_test.py
@@ -2,9 +2,11 @@ import cgi
import collections
import errno
import os
+import shutil
import signal
import socket
import sys
+import tempfile
import traceback
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_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):
fd = sock.makefile('rb')