@@ -12,19 +12,19 @@ import (
1212func TestRewriteProxyHTMLRewritesRootRelativeAssetsAndInjectsRuntime (t * testing.T ) {
1313 input := []byte (`<!doctype html><html><head><script src="/assets/app.js"></script></head><body><img src="/hero.png"><a href="/docs">Docs</a></body></html>` )
1414
15- output , err := rewriteProxyHTML (input , "/api/ browser/proxy /browser-1/" , "/" , "browser-1" )
15+ output , err := rewriteProxyHTML (input , "/browser/browser-1/" , "/" , "browser-1" )
1616 if err != nil {
1717 t .Fatalf ("rewriteProxyHTML() error = %v" , err )
1818 }
1919 html := string (output )
2020
21- if ! strings .Contains (html , `<base href="/api/ browser/proxy /browser-1/"/>` ) {
21+ if ! strings .Contains (html , `<base href="/browser/browser-1/"/>` ) {
2222 t .Fatalf ("expected base href to be injected, got %q" , html )
2323 }
24- if ! strings .Contains (html , `src="/api/ browser/proxy /browser-1/assets/app.js"` ) {
24+ if ! strings .Contains (html , `src="/browser/browser-1/assets/app.js"` ) {
2525 t .Fatalf ("expected script src to be rewritten, got %q" , html )
2626 }
27- if ! strings .Contains (html , `href="/api/ browser/proxy /browser-1/docs"` ) {
27+ if ! strings .Contains (html , `href="/browser/browser-1/docs"` ) {
2828 t .Fatalf ("expected anchor href to be rewritten, got %q" , html )
2929 }
3030 if ! strings .Contains (html , `data-nine-proxy-runtime="true"` ) {
@@ -36,15 +36,45 @@ func TestRewriteProxyHTMLRewritesRootRelativeAssetsAndInjectsRuntime(t *testing.
3636 if ! strings .Contains (html , `var tabId="browser-1"` ) {
3737 t .Fatalf ("expected runtime patch to receive tab id, got %q" , html )
3838 }
39+ if strings .Contains (html , `history.replaceState` ) {
40+ t .Fatalf ("proxy runtime must not move the iframe out of the proxy URL, got %q" , html )
41+ }
42+ if ! strings .Contains (html , `window.location.origin+"/"` ) {
43+ t .Fatalf ("expected runtime patch to normalize same-origin absolute URLs, got %q" , html )
44+ }
45+ }
46+
47+ func TestRewriteProxyHTMLUsesRemoteDocumentDirectoryForRelativeAssets (t * testing.T ) {
48+ input := []byte (`<!doctype html><html><head><script src="chunk.js"></script></head><body></body></html>` )
49+
50+ output , err := rewriteProxyHTML (input , "/browser/browser-1/" , "/docs/page?x=1" , "browser-1" )
51+ if err != nil {
52+ t .Fatalf ("rewriteProxyHTML() error = %v" , err )
53+ }
54+ html := string (output )
55+
56+ if ! strings .Contains (html , `<base href="/browser/browser-1/docs/"/>` ) {
57+ t .Fatalf ("expected base href to use remote directory, got %q" , html )
58+ }
59+ if ! strings .Contains (html , `src="chunk.js"` ) {
60+ t .Fatalf ("expected relative asset to remain relative to base, got %q" , html )
61+ }
62+ }
63+
64+ func TestRewriteProxyAttributeLeavesSchemeRelativeURLsAlone (t * testing.T ) {
65+ got := rewriteProxyAttribute ("//www.gstatic.com/assets/app.js" , "/browser/browser-1/" )
66+ if got != "//www.gstatic.com/assets/app.js" {
67+ t .Fatalf ("expected scheme-relative URL to be preserved, got %q" , got )
68+ }
3969}
4070
4171func TestRewriteProxyLocationRewritesAbsoluteAndRootRelativeLocations (t * testing.T ) {
42- prefix := "/api/ browser/proxy /browser-1/"
72+ prefix := "/browser/browser-1/"
4373
44- if got := rewriteProxyLocation ("/login" , prefix ); got != "/api/ browser/proxy /browser-1/login" {
74+ if got := rewriteProxyLocation ("/login" , prefix ); got != "/browser/browser-1/login" {
4575 t .Fatalf ("rewriteProxyLocation(root-relative) = %q" , got )
4676 }
47- if got := rewriteProxyLocation ("https://example.com/dashboard?x=1" , prefix ); got != "/api/ browser/proxy /browser-1/dashboard?x=1" {
77+ if got := rewriteProxyLocation ("https://example.com/dashboard?x=1" , prefix ); got != "/browser/browser-1/dashboard?x=1" {
4878 t .Fatalf ("rewriteProxyLocation(absolute) = %q" , got )
4979 }
5080 if got := rewriteProxyLocation ("settings" , prefix ); got != "settings" {
@@ -66,7 +96,7 @@ func TestHandleBrowserProxyRewritesHTMLResponses(t *testing.T) {
6696 }
6797
6898 api := New (Dependencies {Mode : "full" , UseBrowser : true , Browser : manager })
69- req := httptest .NewRequest (http .MethodGet , "/api/ browser/proxy /" + tab .ID + "/" , nil )
99+ req := httptest .NewRequest (http .MethodGet , "/browser/" + tab .ID + "/" , nil )
70100 rec := httptest .NewRecorder ()
71101
72102 api .Handler ().ServeHTTP (rec , req )
@@ -75,42 +105,45 @@ func TestHandleBrowserProxyRewritesHTMLResponses(t *testing.T) {
75105 t .Fatalf ("expected 200, got %d: %s" , rec .Code , rec .Body .String ())
76106 }
77107 body := rec .Body .String ()
78- if ! strings .Contains (body , `src="/api/ browser/proxy /` + tab .ID + `/assets/app.js"` ) {
108+ if ! strings .Contains (body , `src="/browser/` + tab .ID + `/assets/app.js"` ) {
79109 t .Fatalf ("expected proxied asset path, got %q" , body )
80110 }
81111 if got := rec .Header ().Get ("X-Frame-Options" ); got != "" {
82112 t .Fatalf ("expected X-Frame-Options to be removed, got %q" , got )
83113 }
114+ if got := rec .Header ().Get ("Cache-Control" ); got != "no-store" {
115+ t .Fatalf ("expected proxied browser responses to disable cache, got %q" , got )
116+ }
84117}
85118
86119func TestRewriteProxyCSSRewritesRootRelativeURLs (t * testing.T ) {
87120 input := []byte (`@font-face{src:url('/cf-fonts/v/inter/normal.woff2')} .hero{background-image:url(/images/hero.png)}` )
88121
89- output := string (rewriteProxyCSS (input , "/api/ browser/proxy /browser-1/" ))
122+ output := string (rewriteProxyCSS (input , "/browser/browser-1/" ))
90123
91- if ! strings .Contains (output , `url('/api/ browser/proxy /browser-1/cf-fonts/v/inter/normal.woff2')` ) {
124+ if ! strings .Contains (output , `url('/browser/browser-1/cf-fonts/v/inter/normal.woff2')` ) {
92125 t .Fatalf ("expected font URL to be rewritten, got %q" , output )
93126 }
94- if ! strings .Contains (output , `url(/api/ browser/proxy /browser-1/images/hero.png)` ) {
127+ if ! strings .Contains (output , `url(/browser/browser-1/images/hero.png)` ) {
95128 t .Fatalf ("expected background URL to be rewritten, got %q" , output )
96129 }
97130}
98131
99132func TestRewriteProxyJavaScriptRewritesRootRelativeAssetAndServiceWorkerPaths (t * testing.T ) {
100133 input := []byte ("const asset=\" /assets/chunk.js\" ; import(\" /assets/entry.js\" ); const sw=`/sw.js`; navigator.serviceWorker.register(\" /sw.js\" ,{scope:\" /\" });" )
101134
102- output := string (rewriteProxyJavaScript (input , "/api/ browser/proxy /browser-1/" ))
135+ output := string (rewriteProxyJavaScript (input , "/browser/browser-1/" ))
103136
104- if ! strings .Contains (output , `"/api/ browser/proxy /browser-1/assets/chunk.js"` ) {
137+ if ! strings .Contains (output , `"/browser/browser-1/assets/chunk.js"` ) {
105138 t .Fatalf ("expected asset string rewrite, got %q" , output )
106139 }
107- if ! strings .Contains (output , `"/api/ browser/proxy /browser-1/sw.js"` ) {
140+ if ! strings .Contains (output , `"/browser/browser-1/sw.js"` ) {
108141 t .Fatalf ("expected service worker script rewrite, got %q" , output )
109142 }
110- if ! strings .Contains (output , "`/api/ browser/proxy /browser-1/sw.js`" ) {
143+ if ! strings .Contains (output , "`/browser/browser-1/sw.js`" ) {
111144 t .Fatalf ("expected template literal service worker rewrite, got %q" , output )
112145 }
113- if ! strings .Contains (output , `scope:"/api/ browser/proxy /browser-1/"` ) {
146+ if ! strings .Contains (output , `scope:"/browser/browser-1/"` ) {
114147 t .Fatalf ("expected service worker scope rewrite, got %q" , output )
115148 }
116149}
0 commit comments