From 5fb1c11a968bd37e4e931d0f2f7e7dbcf4164a4f Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Tue, 24 Feb 2026 03:29:17 +0800 Subject: [PATCH] fix: image proxy url (#14505) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### PR Dependency Tree * **PR #14505** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) ## Summary by CodeRabbit * **Improvements** * Better image-proxy detection to avoid double-proxying already proxied images. * Improved runtime image proxy configuration so images load consistently across deployments. * More robust image URL handling for optimized image loading and fewer redundant requests. --- .../shared/src/adapters/middlewares/proxy.ts | 18 +++++++++++++++--- packages/backend/server/src/server.ts | 12 ++++++++---- .../ai/components/ai-tools/tool-result-card.ts | 6 +++--- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/blocksuite/affine/shared/src/adapters/middlewares/proxy.ts b/blocksuite/affine/shared/src/adapters/middlewares/proxy.ts index ebc463c683..da58918677 100644 --- a/blocksuite/affine/shared/src/adapters/middlewares/proxy.ts +++ b/blocksuite/affine/shared/src/adapters/middlewares/proxy.ts @@ -21,12 +21,24 @@ const imageProxyMiddlewareBuilder = () => { }; }; +const IMAGE_PROXY_PATH = '/api/worker/image-proxy'; + +export const isImageProxyURL = (imageUrl: string) => { + try { + const url = new URL(imageUrl, globalThis.location.origin); + return url.pathname === IMAGE_PROXY_PATH && url.searchParams.has('url'); + } catch { + return false; + } +}; + const defaultImageProxyMiddlewarBuilder = imageProxyMiddlewareBuilder(); export const setImageProxyMiddlewareURL = defaultImageProxyMiddlewarBuilder.set; -export const defaultImageProxyMiddleware = - defaultImageProxyMiddlewarBuilder.get(); +export const defaultImageProxyMiddleware: TransformerMiddleware = args => { + return defaultImageProxyMiddlewarBuilder.get()(args); +}; // TODO(@mirone): this should be configured when setup instead of runtime export class ImageProxyService extends StoreExtension { @@ -40,7 +52,7 @@ export class ImageProxyService extends StoreExtension { } buildUrl(imageUrl: string) { - if (imageUrl.startsWith(this.imageProxyURL)) { + if (imageUrl.startsWith(this.imageProxyURL) || isImageProxyURL(imageUrl)) { return imageUrl; } diff --git a/packages/backend/server/src/server.ts b/packages/backend/server/src/server.ts index e4186546f0..5734516bd9 100644 --- a/packages/backend/server/src/server.ts +++ b/packages/backend/server/src/server.ts @@ -60,10 +60,14 @@ export async function run() { corsOriginCallback( origin, finalAllowedOrigins, - blockedOrigin => - logger.warn(`Blocked CORS request from origin: ${blockedOrigin}`, { - requestPath, - }), + blockedOrigin => { + if (!appendedOrigins.length) { + logger.warn( + `Blocked CORS request from origin: ${blockedOrigin}`, + { requestPath } + ); + } + }, originCallback ); }, diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-tools/tool-result-card.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-tools/tool-result-card.ts index f92c68e8b3..dd35489f06 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-tools/tool-result-card.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-tools/tool-result-card.ts @@ -1,7 +1,7 @@ import { SignalWatcher, WithDisposable } from '@blocksuite/affine/global/lit'; import { unsafeCSSVarV2 } from '@blocksuite/affine/shared/theme'; import { ShadowlessElement } from '@blocksuite/affine/std'; -import { DEFAULT_IMAGE_PROXY_ENDPOINT } from '@blocksuite/affine-shared/consts'; +import { isImageProxyURL } from '@blocksuite/affine-shared/adapters'; import { ToggleDownIcon, ToolIcon } from '@blocksuite/icons/lit'; import { type Signal } from '@preact/signals-core'; import { css, html, nothing, type TemplateResult } from 'lit'; @@ -250,7 +250,7 @@ export class ToolResultCard extends SignalWatcher( @state() private accessor isCollapsed = true; - private readonly imageProxyURL = DEFAULT_IMAGE_PROXY_ENDPOINT; + private readonly imageProxyURL = BUILD_CONFIG.imageProxyUrl; protected override render() { return html` @@ -323,7 +323,7 @@ export class ToolResultCard extends SignalWatcher( } buildUrl(imageUrl: string) { - if (imageUrl.startsWith(this.imageProxyURL)) { + if (imageUrl.startsWith(this.imageProxyURL) || isImageProxyURL(imageUrl)) { return imageUrl; } return `${this.imageProxyURL}?url=${encodeURIComponent(imageUrl)}`;