From 7993b186dac3b486ffb3a84de0da5f5a0df7eff5 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 4 Aug 2026 11:33:52 +0800 Subject: [PATCH] fix: stop double-encoding keyword - pass raw value as httpcall params (CRUD style); defensive unquote fallback in dspy for legacy cached UI --- wwwroot/knowledge_bases_list/search.ui | 2 +- wwwroot/knowledge_bases_list/search_result.dspy | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/wwwroot/knowledge_bases_list/search.ui b/wwwroot/knowledge_bases_list/search.ui index 971cf1a..24f7b64 100644 --- a/wwwroot/knowledge_bases_list/search.ui +++ b/wwwroot/knowledge_bases_list/search.ui @@ -40,7 +40,7 @@ "wid": "search_bar", "event": "search", "actiontype": "script", - "script": "var kw=event.params.keyword||'';var kb=bricks.getWidgetById('kb_selector',this);var kb_id=(kb&&kb.resultValue())||'all';var u='/rag/knowledge_bases_list/search_result.dspy?_webbricks_=1&kb_id='+encodeURIComponent(kb_id)+'&keyword='+encodeURIComponent(kw);var target=bricks.getWidgetById('search_results',this);if(target){bricks.buildUrlwidgetHandler(this,target,{},{options:{url:u},mode:'replace'})()}" + "script": "var kw=event.params.keyword||'';var kb=bricks.getWidgetById('kb_selector',this);var kb_id=(kb&&kb.resultValue())||'all';var target=bricks.getWidgetById('search_results',this);if(target){bricks.buildUrlwidgetHandler(this,target,{},{options:{url:'/rag/knowledge_bases_list/search_result.dspy',params:{_webbricks_:1,kb_id:kb_id,keyword:kw}},mode:'replace'})()}" }, { "wid": "search_file", diff --git a/wwwroot/knowledge_bases_list/search_result.dspy b/wwwroot/knowledge_bases_list/search_result.dspy index 86fd245..4fbe5b8 100644 --- a/wwwroot/knowledge_bases_list/search_result.dspy +++ b/wwwroot/knowledge_bases_list/search_result.dspy @@ -2,6 +2,17 @@ ns = params_kw.copy() kb_id = ns.get('kb_id', '') env = request._run_ns query = ns.get("query") or ns.get("value") or ns.get("keyword") or ns.get("text") or "" +# Defensive: legacy UI cached in browser double-encodes the keyword (%E5%88%86... arrives as-is). +# Normal path: server already decoded once, no '%' present, this is a no-op. +if "%" in query: + try: + from urllib.parse import unquote + d = unquote(query) + if d != query: + info(f'[search_result] unquote fallback: {query!r} -> {d!r}') + query = d + except Exception: + pass info(f'[search_result] params_kw={params_kw}') info(f'[search_result] parsed: kb_id={kb_id!r} query={query!r} method={request.method} url={request.url}')