code: def check_response(headers: Headers, key: str) -> None:
      
      connection = sum(
          [parse_connection(value) for value in headers.get_all("Connection")], []
      )
  
      if not any(value.lower() == "upgrade" for value in connection):
          raise InvalidUpgrade("Connection", " ".join(connection))
  
      upgrade = sum([parse_upgrade(value) for value in headers.get_all("Upgrade")], [])
  
      # For compatibility with non-strict implementations, ignore case when
      # checking the Upgrade header. It's supposed to be 'WebSocket'.
      if not (len(upgrade) == 1 and upgrade[0].lower() == "websocket"):
          raise InvalidUpgrade("Upgrade", ", ".join(upgrade))
  
      try:
          s_w_accept = headers["Sec-WebSocket-Accept"]
      except KeyError:
          raise InvalidHeader("Sec-WebSocket-Accept")
      except MultipleValuesError:
          raise InvalidHeader(
              "Sec-WebSocket-Accept", "more than one Sec-WebSocket-Accept header found"
          )
  
      if s_w_accept != accept(key):
          raise InvalidHeaderValue("Sec-WebSocket-Accept", s_w_accept)
docs: Check a handshake response received from the server.
  
      ``key`` comes from :func:`build_request`.
  
      If the handshake is valid, this function returns ``None``.
  
      Otherwise it raises an :exc:`~websockets.exceptions.InvalidHandshake`
      exception.
  
      This function doesn't verify that the response is an HTTP/1.1 or higher
      response with a 101 status code. These controls are the responsibility of
      the caller.