Skip to content

Commit cccb9cb

Browse files
author
Sergey Skripnick
committed
Fix wsgi.environment unix socket issue
1 parent dad000e commit cccb9cb

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

aiohttp/wsgi.py

+15-9
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,22 @@ def create_wsgi_environ(self, message, payload):
8888
# http://www.ietf.org/rfc/rfc3875
8989

9090
remote = self.transport.get_extra_info('peername')
91-
environ['REMOTE_ADDR'] = remote[0]
92-
environ['REMOTE_PORT'] = remote[1]
93-
94-
sockname = self.transport.get_extra_info('sockname')
95-
environ['SERVER_PORT'] = str(sockname[1])
96-
host = message.headers.get("HOST", None)
97-
if host:
98-
environ['SERVER_NAME'] = host.split(":")[0]
91+
if remote:
92+
environ['REMOTE_ADDR'] = remote[0]
93+
environ['REMOTE_PORT'] = remote[1]
94+
_host, port = self.transport.get_extra_info('sockname')
95+
environ['SERVER_PORT'] = str(port)
96+
host = message.headers.get("HOST", None)
97+
# SERVER_NAME should be set to value of Host header, but this
98+
# header is not required. In this case we shoud set it to local
99+
# address of socket
100+
environ['SERVER_NAME'] = host.split(":")[0] if host else _host
99101
else:
100-
environ['SERVER_NAME'] = sockname[0]
102+
# Dealing with unix socket, so request was received from client by
103+
# upstream server and this data may be found in the headers
104+
for header in ('REMOTE_ADDR', 'REMOTE_PORT',
105+
'SERVER_NAME', 'SERVER_PORT'):
106+
environ[header] = message.headers.get(header, '')
101107

102108
path_info = uri_parts.path
103109
if script_name:

tests/test_wsgi.py

+13
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,16 @@ def test_http_1_0_no_host(self):
275275
environ = self._make_one()
276276
self.assertEqual(environ['SERVER_NAME'], '2.3.4.5')
277277
self.assertEqual(environ['SERVER_PORT'], '80')
278+
279+
def test_unix_socket(self):
280+
self.transport.get_extra_info = unittest.mock.Mock(return_value=None)
281+
headers = multidict.MultiDict({
282+
'SERVER_NAME': '1.2.3.4', 'SERVER_PORT': '5678',
283+
'REMOTE_ADDR': '4.3.2.1', 'REMOTE_PORT': '8765'})
284+
self.message = protocol.RawRequestMessage(
285+
'GET', '/', (1, 0), headers, True, 'deflate')
286+
environ = self._make_one()
287+
self.assertEqual(environ['SERVER_NAME'], '1.2.3.4')
288+
self.assertEqual(environ['SERVER_PORT'], '5678')
289+
self.assertEqual(environ['REMOTE_ADDR'], '4.3.2.1')
290+
self.assertEqual(environ['REMOTE_PORT'], '8765')

0 commit comments

Comments
 (0)