Skip to content

Commit e438b0e

Browse files
committed
Bound preview rewriting to REST URLs
1 parent caf9681 commit e438b0e

2 files changed

Lines changed: 15 additions & 7 deletions

File tree

packages/runtime-playground/src/preview-server.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,21 @@ function shouldRewriteProxyResponse(headers: IncomingHttpHeaders): boolean {
242242
&& (contentType.startsWith("text/") || /(?:^|\/)(?:[^;]+\+)?(?:json|javascript|xml)(?:;|$)/.test(contentType))
243243
}
244244

245-
function rewritePreviewOrigin(body: string, targetOrigin: string, proxyOrigin: string): string {
245+
function rewritePreviewBodyOrigin(body: string, targetOrigin: string, proxyOrigin: string): string {
246246
return body
247+
.replaceAll(`${targetOrigin}/wp-json`, `${proxyOrigin}/wp-json`)
248+
.replaceAll(`${targetOrigin.replaceAll("/", "\\/")}\\/wp-json`, `${proxyOrigin.replaceAll("/", "\\/")}\\/wp-json`)
249+
}
250+
251+
function rewritePreviewHeaderOrigin(value: string, targetOrigin: string, proxyOrigin: string): string {
252+
return value
247253
.replaceAll(targetOrigin, proxyOrigin)
248254
.replaceAll(targetOrigin.replaceAll("/", "\\/"), proxyOrigin.replaceAll("/", "\\/"))
249255
}
250256

251257
function previewOriginRewriteStream(targetOrigin: string, proxyOrigin: string): Transform {
252258
const decoder = new StringDecoder("utf8")
253-
const patterns = [targetOrigin, targetOrigin.replaceAll("/", "\\/")]
259+
const patterns = [`${targetOrigin}/wp-json`, `${targetOrigin.replaceAll("/", "\\/")}\\/wp-json`]
254260
const retainedCharacters = Math.max(...patterns.map((pattern) => pattern.length)) - 1
255261
let pending = ""
256262

@@ -264,10 +270,10 @@ function previewOriginRewriteStream(targetOrigin: string, proxyOrigin: string):
264270
}
265271
}
266272
pending = text.slice(splitAt)
267-
callback(null, rewritePreviewOrigin(text.slice(0, splitAt), targetOrigin, proxyOrigin))
273+
callback(null, rewritePreviewBodyOrigin(text.slice(0, splitAt), targetOrigin, proxyOrigin))
268274
},
269275
flush(callback) {
270-
callback(null, rewritePreviewOrigin(pending + decoder.end(), targetOrigin, proxyOrigin))
276+
callback(null, rewritePreviewBodyOrigin(pending + decoder.end(), targetOrigin, proxyOrigin))
271277
},
272278
})
273279
}
@@ -345,8 +351,8 @@ function proxyResponseHeaders(headers: IncomingHttpHeaders, targetOrigin?: strin
345351

346352
if (targetOrigin && proxyOrigin) {
347353
for (const [name, value] of Object.entries(forwarded)) {
348-
if (typeof value === "string") forwarded[name] = rewritePreviewOrigin(value, targetOrigin, proxyOrigin)
349-
else if (Array.isArray(value)) forwarded[name] = value.map((item) => rewritePreviewOrigin(item, targetOrigin, proxyOrigin))
354+
if (typeof value === "string") forwarded[name] = rewritePreviewHeaderOrigin(value, targetOrigin, proxyOrigin)
355+
else if (Array.isArray(value)) forwarded[name] = value.map((item) => rewritePreviewHeaderOrigin(item, targetOrigin, proxyOrigin))
350356
}
351357
}
352358

tests/browser-callback-materialization-contracts.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ const targetServer = createServer(async (request, response) => {
151151
const escapedOrigin = targetServerUrl.replaceAll("/", "\\/")
152152
const splitAt = Math.floor(escapedOrigin.length / 2)
153153
response.write(`<script>window.wpApiSettings={"root":"${escapedOrigin.slice(0, splitAt)}`)
154-
response.end(`${escapedOrigin.slice(splitAt)}\\/wp-json\\/"}</script>`)
154+
response.end(`${escapedOrigin.slice(splitAt)}\\/wp-json\\/","asset":"${escapedOrigin}\\/wp-includes\\/editor.js"}</script>`)
155155
return
156156
}
157157
if (request.url === "/wp-json/wp/v2/pages/5") {
@@ -194,6 +194,8 @@ try {
194194
const editorHtml = await fetch(`${proxied.serverUrl}/editor`).then((response) => response.text())
195195
const restUrl = editorHtml.match(/root":"([^\"]+)/)?.[1]?.replaceAll("\\/", "/")
196196
assert.equal(restUrl, `${proxied.serverUrl}/wp-json/`, "WordPress browser URLs use the preview proxy origin")
197+
const assetUrl = editorHtml.match(/asset":"([^\"]+)/)?.[1]?.replaceAll("\\/", "/")
198+
assert.equal(assetUrl, `${targetServerUrl}/wp-includes/editor.js`, "unrelated asset URLs remain on the upstream origin")
197199

198200
const mutationUrl = new URL("wp/v2/pages/5", restUrl).toString()
199201
const preflight = await fetch(mutationUrl, {

0 commit comments

Comments
 (0)