Skip to content

Commit 5a2e706

Browse files
authored
[Website] Support data URLs in blueprint-url query parameter (#158)
## Motivation for the change, related issues Ensures URLs with data URL-based Blueprints, such as ``` https://playground.wordpress.net?blueprint-url=data%3Aapplication%2Fjson%3Bbase64%2CeyJsYW5kaW5nUGFnZSI... ``` continue to work. They stopped working in Automattic/wordpress-playground-private#75 due to FetchFilesystem class. It assumed a non-data URL and constructed a `new URL('./', baseUrl)` object in its constructor – which failed when `baseUrl` was a data URL. See Automattic/wordpress-playground-private#157 for more details ## Testing Instructions (or ideally a Blueprint) Confirm E2E tests pass – this PR ships a new one Try [this data URL Blueprint](http://127.0.0.1:5400/website-server/?blueprint-url=data%3Aapplication%2Fjson%3Bbase64%2CeyJsYW5kaW5nUGFnZSI6Ii9mcmllbmRzLz9yZWZyZXNoJndlbGNvbWUiLCJmZWF0dXJlcyI6eyJuZXR3b3JraW5nIjp0cnVlfSwic3RlcHMiOlt7InN0ZXAiOiJta2RpciIsInBhdGgiOiJ3b3JkcHJlc3Mvd3AtY29udGVudC9tdS1wbHVnaW5zIn0seyJzdGVwIjoid3JpdGVGaWxlIiwicGF0aCI6IndvcmRwcmVzcy93cC1jb250ZW50L211LXBsdWdpbnMvYWRkRmlsdGVyLTEucGhwIiwiZGF0YSI6Ijw%2FcGhwIGFkZF9hY3Rpb24oICdyZXF1ZXN0cy1yZXF1ZXN0cy5iZWZvcmVfcmVxdWVzdCcsIGZ1bmN0aW9uKCAmJHVybCApIHtcbiR1cmwgPSAnaHR0cHM6Ly9wbGF5Z3JvdW5kLndvcmRwcmVzcy5uZXQvY29ycy1wcm94eS5waHA%2FJyAuICR1cmw7XG59ICk7In0seyJzdGVwIjoic2V0U2l0ZU9wdGlvbnMiLCJvcHRpb25zIjp7InBlcm1hbGlua19zdHJ1Y3R1cmUiOiIvJXBvc3RuYW1lJS8ifX0seyJzdGVwIjoiaW5zdGFsbFBsdWdpbiIsInBsdWdpbkRhdGEiOnsicmVzb3VyY2UiOiJ3b3JkcHJlc3Mub3JnL3BsdWdpbnMiLCJzbHVnIjoiZnJpZW5kcyJ9LCJvcHRpb25zIjp7ImFjdGl2YXRlIjp0cnVlfX0seyJzdGVwIjoicnVuUEhQIiwiY29kZSI6Ijw%2FcGhwIHJlcXVpcmVfb25jZSAnd29yZHByZXNzL3dwLWxvYWQucGhwJztcbmlmICggY2xhc3NfZXhpc3RzKCdGcmllbmRzXFxJbXBvcnQnKSkge1xuRnJpZW5kc1xcSW1wb3J0OjpvcG1sKFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwidXRmLThcXFwiPz48b3BtbCB2ZXJzaW9uPVxcXCIyLjBcXFwiPlxuPGhlYWQ%2BXG48dGl0bGU%2BU3Vic2NyaXB0aW9uczwvdGl0bGU%2BXG48L2hlYWQ%2BXG48Ym9keT5cbjxvdXRsaW5lIHRleHQ9XFxcIlN1YnNjcmlwdGlvbnNcXFwiIHRpdGxlPVxcXCJTdWJzY3JpcHRpb25zXFxcIj5cbjxvdXRsaW5lIHR5cGU9XFxcInJzc1xcXCIgdGV4dD1cXFwiQWxleCBLaXJrXFxcIiB0aXRsZT1cXFwiQWxleCBLaXJrXFxcIiB4bWxVcmw9XFxcImh0dHBzOi8vYWxleC5raXJrLmF0XFxcIiBodG1sVXJsPVxcXCJodHRwczovL2FsZXgua2lyay5hdFxcXCIgLz5cbjxvdXRsaW5lIHR5cGU9XFxcInJzc1xcXCIgdGV4dD1cXFwiQWRhbSBaaWVsacWEc2tpXFxcIiB0aXRsZT1cXFwiQWRhbSBaaWVsacWEc2tpXFxcIiB4bWxVcmw9XFxcImh0dHBzOi8vYWRhbWFkYW0uYmxvZ1xcXCIgaHRtbFVybD1cXFwiaHR0cHM6Ly9hZGFtYWRhbS5ibG9nXFxcIiAvPlxuPC9vdXRsaW5lPlxuPC9ib2R5PlxuPC9vcG1sPlwiKTtcbn0ifV19)
1 parent a7c1061 commit 5a2e706

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

packages/playground/storage/src/lib/filesystems.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,16 @@ export interface FetchFilesystemOptions {
170170
* It can optionally use a CORS proxy and resolve paths relative to a base URL.
171171
*/
172172
export class FetchFilesystem implements Filesystem {
173-
private baseUrl: string;
173+
private baseUrl = '';
174174
private options: FetchFilesystemOptions;
175+
private isDataUrl: boolean;
175176

176177
constructor(options: FetchFilesystemOptions) {
177178
this.options = options;
179+
this.isDataUrl = options.baseUrl.startsWith('data:');
180+
if (this.isDataUrl) {
181+
return;
182+
}
178183
// Ensure the base URL ends with a slash
179184
const url = new URL('./', options.baseUrl);
180185
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
@@ -188,6 +193,12 @@ export class FetchFilesystem implements Filesystem {
188193
}
189194

190195
async read(path: string): Promise<StreamedFile> {
196+
if (this.isDataUrl) {
197+
throw new Error(
198+
'FetchFilesystem cannot fetch files from data URLs'
199+
);
200+
}
201+
191202
// Make sure there's no .. segments in the path
192203
path = normalizePath(path);
193204
// Prevent escaping the base URL

packages/playground/website/playwright/e2e/blueprints.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ test('?blueprint-url=... should work with simple blueprints', async ({
3232
);
3333
});
3434

35+
test('?blueprint-url=... should accept data URLs', async ({
36+
page,
37+
website,
38+
wordpress,
39+
}) => {
40+
await website.goto('/');
41+
const blueprintUrl = encodeURIComponent(
42+
`data:application/json;base64,eyJsYW5kaW5nUGFnZSI6Ii9weWdtYWxpb24udHh0Iiwic3RlcHMiOlt7InN0ZXAiOiJ3cml0ZUZpbGUiLCJwYXRoIjoiL3dvcmRwcmVzcy9weWdtYWxpb24udHh0IiwiZGF0YSI6IlBSRUZBQ0UgVE8gUFlHTUFMSU9OIn1dfQ==`
43+
);
44+
await website.goto(`/?blueprint-url=${blueprintUrl}`);
45+
await expect(wordpress.locator('body')).toContainText(
46+
'PREFACE TO PYGMALION'
47+
);
48+
});
49+
3550
test('?blueprint-url=... should work with ZIP bundles', async ({
3651
page,
3752
website,

0 commit comments

Comments
 (0)