From b343d453bc2459f711044339bb65a248a2f6f7a8 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 28 Feb 2023 17:08:46 -0800 Subject: [PATCH] fix(trace viewer): allow http/https mismatch when deployed as https (#21289) References #21263. --- packages/trace-viewer/src/snapshotServer.ts | 11 ++++++++--- packages/trace-viewer/src/sw.ts | 9 ++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/trace-viewer/src/snapshotServer.ts b/packages/trace-viewer/src/snapshotServer.ts index c32e1710fe..628bcb2f54 100644 --- a/packages/trace-viewer/src/snapshotServer.ts +++ b/packages/trace-viewer/src/snapshotServer.ts @@ -17,6 +17,7 @@ import type { SnapshotStorage } from './snapshotStorage'; import type { URLSearchParams } from 'url'; import type { SnapshotRenderer } from './snapshotRenderer'; +import type { ResourceSnapshot } from '@trace/snapshot'; type Point = { x: number, y: number }; @@ -62,10 +63,14 @@ export class SnapshotServer { }); } - async serveResource(requestUrl: string, snapshotUrl: string): Promise { + async serveResource(requestUrlAlternatives: string[], snapshotUrl: string): Promise { + let resource: ResourceSnapshot | undefined; const snapshot = this._snapshotIds.get(snapshotUrl)!; - const url = removeHash(requestUrl); - const resource = snapshot?.resourceByUrl(url); + for (const requestUrl of requestUrlAlternatives) { + resource = snapshot?.resourceByUrl(removeHash(requestUrl)); + if (resource) + break; + } if (!resource) return new Response(null, { status: 404 }); diff --git a/packages/trace-viewer/src/sw.ts b/packages/trace-viewer/src/sw.ts index 1e89331ba5..70bf560a27 100644 --- a/packages/trace-viewer/src/sw.ts +++ b/packages/trace-viewer/src/sw.ts @@ -124,7 +124,14 @@ async function doFetch(event: FetchEvent): Promise { const { snapshotServer } = loadedTraces.get(traceUrl) || {}; if (!snapshotServer) return new Response(null, { status: 404 }); - return snapshotServer.serveResource(request.url, snapshotUrl); + + const lookupUrls = [request.url]; + // When trace viewer is deployed over https, Chrome changes http subresources + // in snapshots to https, presumably to avoid mixed-content. + // In this case, we additionally match http resources from the archive. + if (self.registration.scope.startsWith('https://') && request.url.startsWith('https://')) + lookupUrls.push(request.url.replace(/^https/, 'http')); + return snapshotServer.serveResource(lookupUrls, snapshotUrl); } async function gc() {