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