| @@ -765,17 +765,22 @@ class ToolManager: | |||
| @classmethod | |||
| def generate_builtin_tool_icon_url(cls, provider_id: str) -> str: | |||
| return ( | |||
| dify_config.CONSOLE_API_URL | |||
| + "/console/api/workspaces/current/tool-provider/builtin/" | |||
| + provider_id | |||
| + "/icon" | |||
| return str( | |||
| URL(dify_config.CONSOLE_API_URL or "/") | |||
| / "console" | |||
| / "api" | |||
| / "workspaces" | |||
| / "current" | |||
| / "tool-provider" | |||
| / "builtin" | |||
| / provider_id | |||
| / "icon" | |||
| ) | |||
| @classmethod | |||
| def generate_plugin_tool_icon_url(cls, tenant_id: str, filename: str) -> str: | |||
| return str( | |||
| URL(dify_config.CONSOLE_API_URL) | |||
| URL(dify_config.CONSOLE_API_URL or "/") | |||
| / "console" | |||
| / "api" | |||
| / "workspaces" | |||
| @@ -29,7 +29,9 @@ logger = logging.getLogger(__name__) | |||
| class ToolTransformService: | |||
| @classmethod | |||
| def get_plugin_icon_url(cls, tenant_id: str, filename: str) -> str: | |||
| url_prefix = URL(dify_config.CONSOLE_API_URL) / "console" / "api" / "workspaces" / "current" / "plugin" / "icon" | |||
| url_prefix = ( | |||
| URL(dify_config.CONSOLE_API_URL or "/") / "console" / "api" / "workspaces" / "current" / "plugin" / "icon" | |||
| ) | |||
| return str(url_prefix % {"tenant_id": tenant_id, "filename": filename}) | |||
| @classmethod | |||
| @@ -37,7 +39,9 @@ class ToolTransformService: | |||
| """ | |||
| get tool provider icon url | |||
| """ | |||
| url_prefix = URL(dify_config.CONSOLE_API_URL) / "console" / "api" / "workspaces" / "current" / "tool-provider" | |||
| url_prefix = ( | |||
| URL(dify_config.CONSOLE_API_URL or "/") / "console" / "api" / "workspaces" / "current" / "tool-provider" | |||
| ) | |||
| if provider_type == ToolProviderType.BUILT_IN.value: | |||
| return str(url_prefix / "builtin" / provider_name / "icon") | |||
| @@ -18,6 +18,12 @@ def test_yarl_urls(): | |||
| assert str(URL("https://dify.ai/api") / "v1") == expected_3 | |||
| assert str(URL("https://dify.ai/api/") / "v1") == expected_3 | |||
| expected_4 = "api" | |||
| assert str(URL("") / "api") == expected_4 | |||
| expected_5 = "/api" | |||
| assert str(URL("/") / "api") == expected_5 | |||
| with pytest.raises(ValueError) as e1: | |||
| str(URL("https://dify.ai") / "/api") | |||
| assert str(e1.value) == "Appending path '/api' starting from slash is forbidden" | |||
| @@ -4,19 +4,6 @@ server { | |||
| listen ${NGINX_PORT}; | |||
| server_name ${NGINX_SERVER_NAME}; | |||
| # Rule 1: Handle application entry points (preserve /app/{id}) | |||
| location ~ ^/app/[a-f0-9-]+$ { | |||
| proxy_pass http://api:5001; | |||
| include proxy.conf; | |||
| } | |||
| # Rule 2: Handle static resource requests (remove /app/{id} prefix) | |||
| location ~ ^/app/[a-f0-9-]+/(console/api/.*)$ { | |||
| rewrite ^/app/[a-f0-9-]+/(.*)$ /$1 break; | |||
| proxy_pass http://api:5001; | |||
| include proxy.conf; | |||
| } | |||
| location /console/api { | |||
| proxy_pass http://api:5001; | |||
| include proxy.conf; | |||