From 726ad5530f04983a559cfb9232d413ba072f55a5 Mon Sep 17 00:00:00 2001 From: BiFangKNT <1320414964@qq.com> Date: Wed, 21 Oct 2026 12:03:00 +0800 Subject: [PATCH] fix(web): omit referrer when loading message images Set no-referrer on message thumbnails and previews to prevent QQ image requests from returning 400 and triggering ORB. Add browser coverage for image loading and request headers. --- .../components/MessageContentRenderer.tsx | 1 + .../debug-dialog/ImagePreviewDialog.tsx | 1 + web/tests/e2e/monitoring-executions.spec.ts | 63 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/web/src/app/home/monitoring/components/MessageContentRenderer.tsx b/web/src/app/home/monitoring/components/MessageContentRenderer.tsx index 0a29102e6..b37c9d8a1 100644 --- a/web/src/app/home/monitoring/components/MessageContentRenderer.tsx +++ b/web/src/app/home/monitoring/components/MessageContentRenderer.tsx @@ -87,6 +87,7 @@ export function MessageContentRenderer({ Message attachment { diff --git a/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx b/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx index c744c850a..55522968f 100644 --- a/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx +++ b/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx @@ -35,6 +35,7 @@ export default function ImagePreviewDialog({ {/* 图片 */} Preview e.stopPropagation()} diff --git a/web/tests/e2e/monitoring-executions.spec.ts b/web/tests/e2e/monitoring-executions.spec.ts index 9213d04f9..eaa1e06bc 100644 --- a/web/tests/e2e/monitoring-executions.spec.ts +++ b/web/tests/e2e/monitoring-executions.spec.ts @@ -24,6 +24,69 @@ const pageOf = ( next_offset = items.length, ) => ({ items, has_more, next_offset }); +test('loads external input images and previews without sending a referrer', async ({ + page, +}) => { + await installLangBotApiMocks(page, { + authenticated: true, + monitoringData: monitoring, + }); + const imageUrl = 'https://images.example.test/attachment.png'; + const referrers: (string | undefined)[] = []; + await page.route(imageUrl, async (route) => { + const referrer = route.request().headers().referer; + referrers.push(referrer); + // Match providers that return JSON errors for embedded requests. + if (referrer) { + await route.fulfill({ status: 400, json: { error: 'Invalid referrer' } }); + return; + } + await route.fulfill({ + contentType: 'image/png', + headers: { 'Cache-Control': 'no-store' }, + body: Buffer.from( + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+aX1sAAAAASUVORK5CYII=', + 'base64', + ), + }); + }); + await page.route('**/api/v1/monitoring/executions/*/*?*', async (route) => { + await route.fulfill({ + json: { + code: 0, + data: { + source: 'pipeline', + row, + pages: { + inputs: pageOf([ + { id: 'image', content: [{ type: 'Image', url: imageUrl }] }, + ]), + outputs: pageOf([]), + deliveries: pageOf([]), + errors: pageOf([]), + }, + }, + }, + }); + }); + await page.goto('/home/monitoring'); + await page + .getByRole('button') + .filter({ hasText: 'Open this execution' }) + .click(); + const thumbnail = page.getByRole('img', { name: 'Message attachment' }); + await expect + .poll(() => thumbnail.evaluate((img: HTMLImageElement) => img.naturalWidth)) + .toBe(1); + await thumbnail.click(); + const preview = page.getByRole('img', { name: 'Preview', exact: true }); + await expect(preview).toBeVisible(); + await expect + .poll(() => preview.evaluate((img: HTMLImageElement) => img.naturalWidth)) + .toBe(1); + expect(referrers).toEqual([undefined, undefined]); +}); + test('loads collapsed history on demand, retries and pages without reloading it on reopen', async ({ page, }) => {