diff --git a/swift/proxy/server.py b/swift/proxy/server.py index a0cc1443da..5a540683ad 100644 --- a/swift/proxy/server.py +++ b/swift/proxy/server.py @@ -1551,6 +1551,8 @@ class Application(BaseApplication): if not client and 'x-forwarded-for' in req.headers: # remote user for other lbs client = req.headers['x-forwarded-for'].split(',')[0].strip() + if not client: + client = req.remote_addr logged_headers = None if self.log_headers: logged_headers = '\n'.join('%s: %s' % (k, v) diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py index 782a31d2c5..a5c8307db2 100644 --- a/test/unit/proxy/test_server.py +++ b/test/unit/proxy/test_server.py @@ -1925,6 +1925,35 @@ class TestObjectController(unittest.TestCase): self.assertEquals(headers[:len(exp)], exp) self.assert_('\r\nContent-Length: 0\r\n' in headers) + def test_client_ip_logging(self): + # test that the client ip field in the log gets populated with the + # ip instead of being blank + (prosrv, acc1srv, acc2srv, con2srv, con2srv, obj1srv, obj2srv) = \ + _test_servers + (prolis, acc1lis, acc2lis, con2lis, con2lis, obj1lis, obj2lis) = \ + _test_sockets + + class Logger(object): + + def info(self, msg): + self.msg = msg + + orig_logger, orig_access_logger = prosrv.logger, prosrv.access_logger + prosrv.logger = prosrv.access_logger = Logger() + sock = connect_tcp(('localhost', prolis.getsockname()[1])) + fd = sock.makefile() + fd.write( + 'GET /v1/a?format=json HTTP/1.1\r\nHost: localhost\r\n' + 'Connection: close\r\nX-Auth-Token: t\r\n' + 'Content-Length: 0\r\n' + '\r\n') + fd.flush() + headers = readuntil2crlfs(fd) + exp = 'HTTP/1.1 200' + self.assertEquals(headers[:len(exp)], exp) + exp = '127.0.0.1 127.0.0.1' + self.assert_(exp in prosrv.logger.msg) + def test_chunked_put_logging(self): # GET account with a query string to test that # Application.log_request logs the query string. Also, throws