def create_wsgi_environ(self, message, payload): uri_parts = urlsplit(message.path) url_scheme = 'https' if self.is_ssl else 'http' environ = { 'wsgi.input': payload, 'wsgi.errors': sys.stderr, 'wsgi.version': (1, 0), 'wsgi.async': True, 'wsgi.multithread': False, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'wsgi.file_wrapper': FileWrapper, 'wsgi.url_scheme': url_scheme, 'SERVER_SOFTWARE': aiohttp.HttpMessage.SERVER_SOFTWARE, 'REQUEST_METHOD': message.method, 'QUERY_STRING': uri_parts.query or '', 'RAW_URI': message.path, 'SERVER_PROTOCOL': 'HTTP/%s.%s' % message.version } # authors should be aware that REMOTE_HOST and REMOTE_ADDR # may not qualify the remote addr: # http://www.ietf.org/rfc/rfc3875 forward = self.transport.get_extra_info('addr', '127.0.0.1') script_name = self.SCRIPT_NAME server = forward for hdr_name, hdr_value in message.headers.items(): if hdr_name == 'HOST': server = hdr_value elif hdr_name == 'SCRIPT_NAME': script_name = hdr_value elif hdr_name == 'CONTENT-TYPE': environ['CONTENT_TYPE'] = hdr_value continue elif hdr_name == 'CONTENT-LENGTH': environ['CONTENT_LENGTH'] = hdr_value continue key = 'HTTP_%s' % hdr_name.replace('-', '_') if key in environ: hdr_value = '%s,%s' % (environ[key], hdr_value) environ[key] = hdr_value remote = helpers.parse_remote_addr(forward) environ['REMOTE_ADDR'] = remote[0] environ['REMOTE_PORT'] = remote[1] if isinstance(server, str): server = server.split(':') if len(server) == 1: server.append('80' if url_scheme == 'http' else '443') environ['SERVER_NAME'] = server[0] environ['SERVER_PORT'] = str(server[1]) path_info = uri_parts.path if script_name: path_info = path_info.split(script_name, 1)[-1] environ['PATH_INFO'] = path_info environ['SCRIPT_NAME'] = script_name environ['async.reader'] = self.reader environ['async.writer'] = self.writer return environ
def create_wsgi_environ(self, message, payload): uri_parts = urlsplit(message.path) url_scheme = 'https' if self.is_ssl else 'http' environ = { 'wsgi.input': payload, 'wsgi.errors': sys.stderr, 'wsgi.version': (1, 0), 'wsgi.async': True, 'wsgi.multithread': False, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'wsgi.file_wrapper': FileWrapper, 'wsgi.url_scheme': url_scheme, 'SERVER_SOFTWARE': aiohttp.HttpMessage.SERVER_SOFTWARE, 'REQUEST_METHOD': message.method, 'QUERY_STRING': uri_parts.query or '', 'RAW_URI': message.path, 'SERVER_PROTOCOL': 'HTTP/%s.%s' % message.version } # authors should be aware that REMOTE_HOST and REMOTE_ADDR # may not qualify the remote addr: # http://www.ietf.org/rfc/rfc3875 forward = self.transport.get_extra_info('addr', '127.0.0.1') script_name = self.SCRIPT_NAME server = forward for hdr_name, hdr_value in message.headers.items(getall=True): if hdr_name == 'HOST': server = hdr_value elif hdr_name == 'SCRIPT_NAME': script_name = hdr_value elif hdr_name == 'CONTENT-TYPE': environ['CONTENT_TYPE'] = hdr_value continue elif hdr_name == 'CONTENT-LENGTH': environ['CONTENT_LENGTH'] = hdr_value continue key = 'HTTP_%s' % hdr_name.replace('-', '_') if key in environ: hdr_value = '%s,%s' % (environ[key], hdr_value) environ[key] = hdr_value if isinstance(forward, str): # we only took the last one # http://en.wikipedia.org/wiki/X-Forwarded-For if ',' in forward: forward = forward.rsplit(',', 1)[-1].strip() # find host and port on ipv6 address if '[' in forward and ']' in forward: host = forward.split(']')[0][1:].lower() elif ':' in forward and forward.count(':') == 1: host = forward.split(':')[0].lower() else: host = forward forward = forward.split(']')[-1] if ':' in forward and forward.count(':') == 1: port = forward.split(':', 1)[1] else: port = 80 remote = (host, port) else: remote = forward environ['REMOTE_ADDR'] = remote[0] environ['REMOTE_PORT'] = str(remote[1]) if isinstance(server, str): server = server.split(':') if len(server) == 1: server.append('80' if url_scheme == 'http' else '443') environ['SERVER_NAME'] = server[0] environ['SERVER_PORT'] = str(server[1]) path_info = uri_parts.path if script_name: path_info = path_info.split(script_name, 1)[-1] environ['PATH_INFO'] = unquote(path_info) environ['SCRIPT_NAME'] = script_name environ['async.reader'] = self.reader environ['async.writer'] = self.writer return environ