wsgi: Unix socket address representation; Thanks to Samuel Merritt
https://github.com/eventlet/eventlet/pull/320
This commit is contained in:
		@@ -44,6 +44,15 @@ def format_date_time(timestamp):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def addr_to_host_port(addr):
 | 
			
		||||
    host = 'unix'
 | 
			
		||||
    port = ''
 | 
			
		||||
    if isinstance(addr, tuple):
 | 
			
		||||
        host = addr[0]
 | 
			
		||||
        port = addr[1]
 | 
			
		||||
    return (host, port)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Collections of error codes to compare against.  Not all attributes are set
 | 
			
		||||
# on errno module on all platforms, so some are literals :(
 | 
			
		||||
BAD_SOCK = set((errno.EBADF, 10053))
 | 
			
		||||
@@ -536,8 +545,8 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
                        self.close_connection = 1
 | 
			
		||||
                        self.server.log.error((
 | 
			
		||||
                            'chunked encoding error while discarding request body.'
 | 
			
		||||
                            + ' ip={0} request="{1}" error="{2}"').format(
 | 
			
		||||
                                self.get_client_ip(), self.requestline, e,
 | 
			
		||||
                            + ' client={0} request="{1}" error="{2}"').format(
 | 
			
		||||
                                self.get_client_address()[0], self.requestline, e,
 | 
			
		||||
                        ))
 | 
			
		||||
            finish = time.time()
 | 
			
		||||
 | 
			
		||||
@@ -545,9 +554,11 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
                hook(self.environ, *args, **kwargs)
 | 
			
		||||
 | 
			
		||||
            if self.server.log_output:
 | 
			
		||||
                client_host, client_port = self.get_client_address()
 | 
			
		||||
 | 
			
		||||
                self.server.log.info(self.server.log_format % {
 | 
			
		||||
                    'client_ip': self.get_client_ip(),
 | 
			
		||||
                    'client_port': self.client_address[1],
 | 
			
		||||
                    'client_ip': client_host,
 | 
			
		||||
                    'client_port': client_port,
 | 
			
		||||
                    'date_time': self.log_date_time_string(),
 | 
			
		||||
                    'request_line': self.requestline,
 | 
			
		||||
                    'status_code': status_code[0],
 | 
			
		||||
@@ -555,13 +566,14 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
                    'wall_seconds': finish - start,
 | 
			
		||||
                })
 | 
			
		||||
 | 
			
		||||
    def get_client_ip(self):
 | 
			
		||||
        client_ip = self.client_address[0]
 | 
			
		||||
    def get_client_address(self):
 | 
			
		||||
        host, port = addr_to_host_port(self.client_address)
 | 
			
		||||
 | 
			
		||||
        if self.server.log_x_forwarded_for:
 | 
			
		||||
            forward = self.headers.get('X-Forwarded-For', '').replace(' ', '')
 | 
			
		||||
            if forward:
 | 
			
		||||
                client_ip = "%s,%s" % (forward, client_ip)
 | 
			
		||||
        return client_ip
 | 
			
		||||
                host = forward + ',' + host
 | 
			
		||||
        return (host, port)
 | 
			
		||||
 | 
			
		||||
    def get_environ(self):
 | 
			
		||||
        env = self.server.get_environ()
 | 
			
		||||
@@ -587,11 +599,13 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
            env['CONTENT_LENGTH'] = length
 | 
			
		||||
        env['SERVER_PROTOCOL'] = 'HTTP/1.0'
 | 
			
		||||
 | 
			
		||||
        host, port = self.request.getsockname()[:2]
 | 
			
		||||
        env['SERVER_NAME'] = host
 | 
			
		||||
        env['SERVER_PORT'] = str(port)
 | 
			
		||||
        env['REMOTE_ADDR'] = self.client_address[0]
 | 
			
		||||
        env['REMOTE_PORT'] = str(self.client_address[1])
 | 
			
		||||
        sockname = self.request.getsockname()
 | 
			
		||||
        server_addr = addr_to_host_port(sockname)
 | 
			
		||||
        env['SERVER_NAME'] = server_addr[0]
 | 
			
		||||
        env['SERVER_PORT'] = str(server_addr[1])
 | 
			
		||||
        client_addr = addr_to_host_port(self.client_address)
 | 
			
		||||
        env['REMOTE_ADDR'] = client_addr[0]
 | 
			
		||||
        env['REMOTE_PORT'] = str(client_addr[1])
 | 
			
		||||
        env['GATEWAY_INTERFACE'] = 'CGI/1.1'
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
 
 | 
			
		||||
@@ -1515,19 +1515,34 @@ class TestHttpd(_TestBase):
 | 
			
		||||
        self.assertEqual(result.headers_original[random_case_header[0]], random_case_header[1])
 | 
			
		||||
 | 
			
		||||
    def test_log_unix_address(self):
 | 
			
		||||
        def app(environ, start_response):
 | 
			
		||||
            start_response('200 OK', [])
 | 
			
		||||
            return ['\n{0}={1}\n'.format(k, v).encode() for k, v in environ.items()]
 | 
			
		||||
 | 
			
		||||
        tempdir = tempfile.mkdtemp('eventlet_test_log_unix_address')
 | 
			
		||||
        path = ''
 | 
			
		||||
        try:
 | 
			
		||||
            sock = eventlet.listen(tempdir + '/socket', socket.AF_UNIX)
 | 
			
		||||
            path = sock.getsockname()
 | 
			
		||||
            server_sock = eventlet.listen(tempdir + '/socket', socket.AF_UNIX)
 | 
			
		||||
            path = server_sock.getsockname()
 | 
			
		||||
 | 
			
		||||
            log = six.StringIO()
 | 
			
		||||
            self.spawn_server(sock=sock, log=log)
 | 
			
		||||
            self.spawn_server(site=app, sock=server_sock, log=log)
 | 
			
		||||
            eventlet.sleep(0)  # need to enter server loop
 | 
			
		||||
            assert 'http:' + path in log.getvalue()
 | 
			
		||||
 | 
			
		||||
            client_sock = eventlet.connect(path, family=socket.AF_UNIX)
 | 
			
		||||
            client_sock.sendall(b'GET / HTTP/1.0\r\nHost: localhost\r\n\r\n')
 | 
			
		||||
            result = read_http(client_sock)
 | 
			
		||||
            client_sock.close()
 | 
			
		||||
            assert '\nunix -' in log.getvalue()
 | 
			
		||||
        finally:
 | 
			
		||||
            shutil.rmtree(tempdir)
 | 
			
		||||
 | 
			
		||||
        assert result.status == 'HTTP/1.1 200 OK', repr(result) + log.getvalue()
 | 
			
		||||
        assert b'\nSERVER_NAME=unix\n' in result.body
 | 
			
		||||
        assert b'\nSERVER_PORT=\n' in result.body
 | 
			
		||||
        assert b'\nREMOTE_ADDR=unix\n' in result.body
 | 
			
		||||
        assert b'\nREMOTE_PORT=\n' in result.body
 | 
			
		||||
 | 
			
		||||
    def test_headers_raw(self):
 | 
			
		||||
        def app(environ, start_response):
 | 
			
		||||
            start_response('200 OK', [])
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user