'Create a new request object with the given parameters, and an
environment otherwise filled in with non-surprising default values.
:param path: encoded, parsed, and unquoted into PATH_INFO
:param environ: WSGI environ dictionary
:param headers: HTTP headers
:param body: stuffed in a WsgiBytesIO and hung on wsgi.input
:param kwargs: any environ key with an property setter'

@classmethod
def blank(cls, path, environ=None, headers=None, body=None, **kwargs):

    headers = (headers or {})
    environ = (environ or {})
    if isinstance(path, six.text_type):
        path = path.encode('utf-8')
    parsed_path = urllib.parse.urlparse(path)
    server_name = 'localhost'
    if parsed_path.netloc:
        server_name = parsed_path.netloc.split(':', 1)[0]
    server_port = parsed_path.port
    if (server_port is None):
        server_port = {'http': 80, 'https': 443}.get(parsed_path.scheme, 80)
    if (parsed_path.scheme and (parsed_path.scheme not in ['http', 'https'])):
        raise TypeError(('Invalid    scheme:    %s' % parsed_path.scheme))
    env = {'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '', 'QUERY_STRING': parsed_path.query, 'PATH_INFO': urllib.parse.unquote(parsed_path.path), 'SERVER_NAME': server_name, 'SERVER_PORT': str(server_port), 'HTTP_HOST': ('%s:%d' % (server_name, server_port)), 'SERVER_PROTOCOL': 'HTTP/1.0', 'wsgi.version': (1, 0), 'wsgi.url_scheme': (parsed_path.scheme or 'http'), 'wsgi.errors': StringIO(), 'wsgi.multithread': False, 'wsgi.multiprocess': False}
    env.update(environ)
    if (body is not None):
        env['wsgi.input'] = WsgiBytesIO(body)
        env['CONTENT_LENGTH'] = str(len(body))
    elif ('wsgi.input' not in env):
        env['wsgi.input'] = WsgiBytesIO()
    req = Request(env)
    for (key, val) in headers.items():
        req.headers[key] = val
    for (key, val) in kwargs.items():
        prop = getattr(Request, key, None)
        if (prop and isinstance(prop, property)):
            try:
                setattr(req, key, val)
            except AttributeError:
                pass
            else:
                continue
        raise TypeError(('got    unexpected    keyword    argument    %r' % key))
    return req
