123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- # Copyright 2022 The Matrix.org Foundation C.I.C.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- from http import HTTPStatus
- from typing import Dict
- from twisted.web.resource import Resource
- from synapse.app.homeserver import SynapseHomeServer
- from synapse.config.server import HttpListenerConfig, HttpResourceConfig, ListenerConfig
- from synapse.http.site import SynapseSite
- from tests.server import make_request
- from tests.unittest import HomeserverTestCase, create_resource_tree, override_config
- class WebClientTests(HomeserverTestCase):
- @override_config(
- {
- "web_client_location": "https://example.org",
- }
- )
- def test_webclient_resolves_with_client_resource(self):
- """
- Tests that both client and webclient resources can be accessed simultaneously.
- This is a regression test created in response to https://github.com/matrix-org/synapse/issues/11763.
- """
- for resource_name_order_list in [
- ["webclient", "client"],
- ["client", "webclient"],
- ]:
- # Create a dictionary from path regex -> resource
- resource_dict: Dict[str, Resource] = {}
- for resource_name in resource_name_order_list:
- resource_dict.update(
- SynapseHomeServer._configure_named_resource(self.hs, resource_name)
- )
- # Create a root resource which ties the above resources together into one
- root_resource = Resource()
- create_resource_tree(resource_dict, root_resource)
- # Create a site configured with this resource to make HTTP requests against
- listener_config = ListenerConfig(
- port=8008,
- bind_addresses=["127.0.0.1"],
- type="http",
- http_options=HttpListenerConfig(
- resources=[HttpResourceConfig(names=resource_name_order_list)]
- ),
- )
- test_site = SynapseSite(
- logger_name="synapse.access.http.fake",
- site_tag=self.hs.config.server.server_name,
- config=listener_config,
- resource=root_resource,
- server_version_string="1",
- max_request_body_size=1234,
- reactor=self.reactor,
- )
- # Attempt to make requests to endpoints on both the webclient and client resources
- # on test_site.
- self._request_client_and_webclient_resources(test_site)
- def _request_client_and_webclient_resources(self, test_site: SynapseSite) -> None:
- """Make a request to an endpoint on both the webclient and client-server resources
- of the given SynapseSite.
- Args:
- test_site: The SynapseSite object to make requests against.
- """
- # Ensure that the *webclient* resource is behaving as expected (we get redirected to
- # the configured web_client_location)
- channel = make_request(
- self.reactor,
- site=test_site,
- method="GET",
- path="/_matrix/client",
- )
- # Check that we are being redirected to the webclient location URI.
- self.assertEqual(channel.code, HTTPStatus.FOUND)
- self.assertEqual(
- channel.headers.getRawHeaders("Location"), ["https://example.org"]
- )
- # Ensure that a request to the *client* resource works.
- channel = make_request(
- self.reactor,
- site=test_site,
- method="GET",
- path="/_matrix/client/v3/login",
- )
- self.assertEqual(channel.code, HTTPStatus.OK)
- self.assertIn("flows", channel.json_body)
|