Example #1
0
	def environ(request, body=None):
		"""
		Converts a ``tornado.httputil.HTTPServerRequest`` to a WSGI environment.

		An optional ``body`` to be used for populating ``wsgi.input`` can be supplied (either a string or a stream). If not
		supplied, ``request.body`` will be wrapped into a ``io.BytesIO`` stream and used instead.

		:param request: the ``tornado.httpserver.HTTPServerRequest`` to derive the WSGI environment from
		:param body: an optional body  to use as ``wsgi.input`` instead of ``request.body``, can be a string or a stream
		"""
		from tornado.wsgi import to_wsgi_str
		import sys
		import io

		# determine the request_body to supply as wsgi.input
		if body is not None:
			if isinstance(body, (bytes, str)):
				request_body = io.BytesIO(tornado.escape.utf8(body))
			else:
				request_body = body
		else:
			request_body = io.BytesIO(tornado.escape.utf8(request.body))

		hostport = request.host.split(":")
		if len(hostport) == 2:
			host = hostport[0]
			port = int(hostport[1])
		else:
			host = request.host
			port = 443 if request.protocol == "https" else 80
		environ = {
		"REQUEST_METHOD": request.method,
		"SCRIPT_NAME": "",
		"PATH_INFO": to_wsgi_str(tornado.escape.url_unescape(
			request.path, encoding=None, plus=False)),
		"QUERY_STRING": request.query,
		"REMOTE_ADDR": request.remote_ip,
		"SERVER_NAME": host,
		"SERVER_PORT": str(port),
		"SERVER_PROTOCOL": request.version,
		"wsgi.version": (1, 0),
		"wsgi.url_scheme": request.protocol,
		"wsgi.input": request_body,
		"wsgi.errors": sys.stderr,
		"wsgi.multithread": False,
		"wsgi.multiprocess": True,
		"wsgi.run_once": False,
		}
		if "Content-Type" in request.headers:
			environ["CONTENT_TYPE"] = request.headers.pop("Content-Type")
		if "Content-Length" in request.headers:
			environ["CONTENT_LENGTH"] = request.headers.pop("Content-Length")
		for key, value in request.headers.items():
			environ["HTTP_" + key.replace("-", "_").upper()] = value
		return environ
Example #2
0
    def environ(request, body=None):
        """
		Converts a ``tornado.httputil.HTTPServerRequest`` to a WSGI environment.

		An optional ``body`` to be used for populating ``wsgi.input`` can be supplied (either a string or a stream). If not
		supplied, ``request.body`` will be wrapped into a ``io.BytesIO`` stream and used instead.

		:param request: the ``tornado.httpserver.HTTPServerRequest`` to derive the WSGI environment from
		:param body: an optional body  to use as ``wsgi.input`` instead of ``request.body``, can be a string or a stream
		"""
        from tornado.wsgi import to_wsgi_str
        import sys
        import io

        # determine the request_body to supply as wsgi.input
        if body is not None:
            if isinstance(body, (bytes, str, unicode)):
                request_body = io.BytesIO(tornado.escape.utf8(body))
            else:
                request_body = body
        else:
            request_body = io.BytesIO(tornado.escape.utf8(request.body))

        hostport = request.host.split(":")
        if len(hostport) == 2:
            host = hostport[0]
            port = int(hostport[1])
        else:
            host = request.host
            port = 443 if request.protocol == "https" else 80
        environ = {
            "REQUEST_METHOD":
            request.method,
            "SCRIPT_NAME":
            "",
            "PATH_INFO":
            to_wsgi_str(
                tornado.escape.url_unescape(request.path,
                                            encoding=None,
                                            plus=False)),
            "QUERY_STRING":
            request.query,
            "REMOTE_ADDR":
            request.remote_ip,
            "SERVER_NAME":
            host,
            "SERVER_PORT":
            str(port),
            "SERVER_PROTOCOL":
            request.version,
            "wsgi.version": (1, 0),
            "wsgi.url_scheme":
            request.protocol,
            "wsgi.input":
            request_body,
            "wsgi.errors":
            sys.stderr,
            "wsgi.multithread":
            False,
            "wsgi.multiprocess":
            True,
            "wsgi.run_once":
            False,
        }
        if "Content-Type" in request.headers:
            environ["CONTENT_TYPE"] = request.headers.pop("Content-Type")
        if "Content-Length" in request.headers:
            environ["CONTENT_LENGTH"] = request.headers.pop("Content-Length")
        for key, value in request.headers.items():
            environ["HTTP_" + key.replace("-", "_").upper()] = value
        return environ