code: def build_environ(scope: Scope, body: bytes) -> dict:
      
      environ = {
          "REQUEST_METHOD": scope["method"],
          "SCRIPT_NAME": scope.get("root_path", ""),
          "PATH_INFO": scope["path"],
          "QUERY_STRING": scope["query_string"].decode("ascii"),
          "SERVER_PROTOCOL": f"HTTP/{scope['http_version']}",
          "wsgi.version": (1, 0),
          "wsgi.url_scheme": scope.get("scheme", "http"),
          "wsgi.input": io.BytesIO(body),
          "wsgi.errors": sys.stdout,
          "wsgi.multithread": True,
          "wsgi.multiprocess": True,
          "wsgi.run_once": False,
      }
  
      # Get server name and port - required in WSGI, not in ASGI
      server = scope.get("server") or ("localhost", 80)
      environ["SERVER_NAME"] = server[0]
      environ["SERVER_PORT"] = server[1]
  
      # Get client IP address
      if scope.get("client"):
          environ["REMOTE_ADDR"] = scope["client"][0]
  
      # Go through headers and make them into environ entries
      for name, value in scope.get("headers", []):
          name = name.decode("latin1")
          if name == "content-length":
              corrected_name = "CONTENT_LENGTH"
          elif name == "content-type":
              corrected_name = "CONTENT_TYPE"
          else:
              corrected_name = f"HTTP_{name}".upper().replace("-", "_")
          # HTTPbis say only ASCII chars are allowed in headers, but we latin1 just in case
          value = value.decode("latin1")
          if corrected_name in environ:
              value = environ[corrected_name] + "," + value
          environ[corrected_name] = value
      return environ
docs: Builds a scope and request body into a WSGI environ object.