Skip to content

Commit

Permalink
Ensure index redirects are relative (#7704)
Browse files Browse the repository at this point in the history
  • Loading branch information
philippjfr authored Feb 12, 2025
1 parent 50f78eb commit e73f054
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
18 changes: 18 additions & 0 deletions panel/io/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,24 @@ class RootHandler(LoginUrlMixin, BkRootHandler):
template variable.
"""

@authenticated
async def get(self, *args, **kwargs):
if self.use_redirect and len(self.applications) == 1:
app_names = list(self.applications.keys())
redirect_to = f".{app_names[0]}"
self.redirect(redirect_to)
else:
apps = sorted(self.applications.keys())
if self.index is None:
index = "app_index.html"
else:
index = self.index
apps = [
app if self.request.uri.endswith('/') or not self.prefix else f"{self.prefix}{app}"
for app in apps
]
self.render(index, prefix=self.prefix, items=apps)

def render(self, *args, **kwargs):
kwargs['PANEL_CDN'] = CDN_DIST
return super().render(*args, **kwargs)
Expand Down
31 changes: 31 additions & 0 deletions panel/tests/ui/io/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,37 @@
pytestmark = pytest.mark.ui


@pytest.mark.parametrize('prefix', ['', '/prefix/'])
def test_server_index_redirect(page, prefix):
serve_component(page, '### App', prefix=prefix, suffix=prefix)

expect(page.locator("h3")).to_have_text('App')

@pytest.mark.parametrize('prefix', ['', '/prefix/'])
def test_server_index_redirect_via_proxy(page, prefix, reverse_proxy):
port, proxy = reverse_proxy
serve_component(page, '### App', prefix=prefix, suffix=f"/proxy{prefix or '/'}", port=port, proxy=proxy)

expect(page.locator("h3")).to_have_text('App')

@pytest.mark.parametrize('prefix', ['', '/prefix/'])
def test_server_index_page_links(page, prefix):
serve_component(page, {'app1': '### App1', 'app2': '### App2'}, prefix=prefix, suffix=prefix, wait=False)

page.locator('.card-link').nth(0).click()

expect(page.locator("h3")).to_have_text('App1')

@pytest.mark.parametrize('prefix', ['', '/prefix/'])
def test_server_index_page_links_via_proxy(page, prefix, reverse_proxy):
port, proxy = reverse_proxy
serve_component(page, {'app1': '### App1', 'app2': '### App2'}, prefix=prefix, suffix=f"/proxy{prefix or '/'}", port=port, proxy=proxy, wait=False)

page.locator('.card-link').nth(0).click()

expect(page.locator("h3")).to_have_text('App1')


def test_server_reuse_sessions(page, reuse_sessions):
def app(counts=[0]):
content = f'### Count {counts[0]}'
Expand Down
6 changes: 5 additions & 1 deletion panel/tests/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ def serve_and_wait(app, page=None, prefix=None, port=None, proxy=None, **kwargs)
port = port or get_open_ports()[0]
else:
serve_app = serve
if proxy:
kwargs['websocket_origin'] = [f'localhost:{proxy}']
serve_app(app, port=port or 0, threaded=True, show=False, liveness=True, server_id=server_id, prefix=prefix or "", **kwargs)
wait_until(lambda: server_id in state._servers, page)
server = state._servers[server_id][0]
Expand Down Expand Up @@ -338,7 +340,9 @@ def serve_and_request(app, suffix="", n=1, port=None, proxy=None, **kwargs):
def wait_for_server(port, prefix=None, timeout=3):
start = time.time()
prefix = prefix or ""
url = f"http://localhost:{port}{prefix}/liveness"
if not prefix.endswith('/'):
prefix += '/'
url = f"http://localhost:{port}{prefix}liveness"
while True:
try:
if requests.get(url).ok:
Expand Down

0 comments on commit e73f054

Please sign in to comment.