Title: [294427] trunk
Revision
294427
Author
drou...@apple.com
Date
2022-05-18 13:01:09 -0700 (Wed, 18 May 2022)

Log Message

Feature Request: Regular _expression_ Groups in Request Override Redirects
https://bugs.webkit.org/show_bug.cgi?id=240477
<rdar://problem/73779368>

Reviewed by Patrick Angle.

This allows developers to create generic "catch all" request local overrides that can redirect
multiple URLs with a single local override (e.g. `https://example.org/(.*)` -> `localhost/$1`).

* Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js:
(WI.LocalResourceOverride):
(WI.LocalResourceOverride.prototype.generateRequestRedirectURL): Added.
(WI.LocalResourceOverride.prototype.matches):
(WI.LocalResourceOverride.prototype.get _urlRegex): Added.
Instead of directly using the URL of the `WI.LocalResource` as the redirect URL, derive it based on
the regex created to check if the `WI.LocalResourceOverride` matches the original request.

* Source/WebInspectorUI/UserInterface/Models/Resource.js:
(WI.Resource.prototype.async createLocalResourceOverride):
* Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js:
(WI.NetworkManager.prototype.async requestIntercepted):
(WI.NetworkManager.prototype.async responseIntercepted):
* Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js:
(WI.LocalResourceOverridePopover.prototype.get serializedData):
Drive-by: Move `WI.urlWithoutFragment` to `WI.LocalResourceOverride` so that every callsite doesn't
          have to decide/remember to use it.

* LayoutTests/http/tests/inspector/network/intercept-request-properties.html:
* LayoutTests/http/tests/inspector/network/intercept-request-properties-expected.txt:

Canonical link: https://commits.webkit.org/250709@main

Modified Paths

Diff

Modified: trunk/LayoutTests/http/tests/inspector/network/intercept-request-properties-expected.txt (294426 => 294427)


--- trunk/LayoutTests/http/tests/inspector/network/intercept-request-properties-expected.txt	2022-05-18 19:48:37 UTC (rev 294426)
+++ trunk/LayoutTests/http/tests/inspector/network/intercept-request-properties-expected.txt	2022-05-18 20:01:09 UTC (rev 294427)
@@ -44,6 +44,16 @@
   Get:
     newURL: value
 
+-- Running test case: Network.interceptRequest.URL.Regex
+Triggering load...
+Request details:
+  URI: /inspector/network/resources/intercept-echo.py?newURL=value
+  Response URL: http://127.0.0.1:8000/inspector/network/resources/intercept-echo.py?newURL=value
+  Method: GET
+  Request Headers:
+  Get:
+    newURL: value
+
 -- Running test case: Network.interceptRequest.URLFragment
 Triggering load...
 Request details:

Modified: trunk/LayoutTests/http/tests/inspector/network/intercept-request-properties.html (294426 => 294427)


--- trunk/LayoutTests/http/tests/inspector/network/intercept-request-properties.html	2022-05-18 19:48:37 UTC (rev 294426)
+++ trunk/LayoutTests/http/tests/inspector/network/intercept-request-properties.html	2022-05-18 20:01:09 UTC (rev 294427)
@@ -77,12 +77,12 @@
         }
     }
 
-    function addTestCase({name, description, _expression_, override}) {
+    function addTestCase({name, description, url, _expression_, override}) {
         suite.addTestCase({
             name,
             description,
             async test() {
-                let localResourceOverride = WI.LocalResourceOverride.create("http://127.0.0.1:8000/inspector/network/resources/intercept-echo.py", WI.LocalResourceOverride.InterceptType.Request, override);
+                let localResourceOverride = WI.LocalResourceOverride.create(url || "http://127.0.0.1:8000/inspector/network/resources/intercept-echo.py", WI.LocalResourceOverride.InterceptType.Request, override);
                 WI.networkManager.addLocalResourceOverride(localResourceOverride);
 
                 InspectorTest.log("Triggering load...");
@@ -132,6 +132,17 @@
     });
 
     addTestCase({
+        name: "Network.interceptRequest.URL.Regex",
+        description: "Tests request method interception a URL regex",
+        url: "(.+)/inspector/network/resources/(.+)",
+        _expression_: "fetchData('resources/intercept-echo.py')",
+        override: {
+            requestURL: "$1/inspector/network/resources/$2?newURL=value",
+            isRegex: true,
+        },
+    });
+
+    addTestCase({
         name: "Network.interceptRequest.URLFragment",
         description: "Tests request method interception with URL with fragment",
         _expression_: "fetchData('resources/intercept-echo.py')",

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js (294426 => 294427)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js	2022-05-18 19:48:37 UTC (rev 294426)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js	2022-05-18 20:01:09 UTC (rev 294427)
@@ -960,8 +960,7 @@
 
     async requestIntercepted(target, requestId, request)
     {
-        let url = ""
-        for (let localResourceOverride of this.localResourceOverridesForURL(url)) {
+        for (let localResourceOverride of this.localResourceOverridesForURL(request.url)) {
             if (localResourceOverride.disabled)
                 continue;
 
@@ -981,7 +980,7 @@
             case WI.LocalResourceOverride.InterceptType.Request: {
                 target.NetworkAgent.interceptWithRequest.invoke({
                     requestId,
-                    url: localResource.url || undefined,
+                    url: localResourceOverride.generateRequestRedirectURL(request.url) ?? undefined,
                     method: localResource.requestMethod ?? undefined,
                     headers: localResource.requestHeaders,
                     postData: (WI.HTTPUtilities.RequestMethodsWithBody.has(localResource.requestMethod) && localResource.requestData) ? btoa(localResource.requestData) : undefined,
@@ -1015,8 +1014,7 @@
 
     async responseIntercepted(target, requestId, response)
     {
-        let url = ""
-        for (let localResourceOverride of this.localResourceOverridesForURL(url)) {
+        for (let localResourceOverride of this.localResourceOverridesForURL(response.url)) {
             if (localResourceOverride.disabled)
                 continue;
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js (294426 => 294427)


--- trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js	2022-05-18 19:48:37 UTC (rev 294426)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js	2022-05-18 20:01:09 UTC (rev 294427)
@@ -38,7 +38,7 @@
 
         super();
 
-        this._url = url;
+        this._url = WI.urlWithoutFragment(url);
         this._urlComponents = null;
         this._type = type;
         this._localResource = localResource;
@@ -227,6 +227,20 @@
         return displayName;
     }
 
+    generateRequestRedirectURL(url)
+    {
+        console.assert(this._type === WI.LocalResourceOverride.InterceptType.Request, this);
+
+        let redirectURL = this._localResource.url;
+        if (!redirectURL)
+            return null;
+
+        if (this._isRegex)
+            return url.replace(this._urlRegex, redirectURL);
+
+        return redirectURL;
+    }
+
     get canMapToFile()
     {
         if (!WI.LocalResource.canMapToFile())
@@ -248,13 +262,13 @@
 
     matches(url)
     {
-        if (this._isRegex) {
-            let regex = new RegExp(this._url, !this._isCaseSensitive ? "i" : "");
-            return regex.test(url);
-        }
+        url = ""
 
+        if (this._isRegex)
+            return this._urlRegex.test(url);
+
         if (!this._isCaseSensitive)
-            return String(url).toLowerCase() === this._url.toLowerCase();
+            return url.toLowerCase() === this._url.toLowerCase();
 
         return url ="" this._url;
     }
@@ -278,6 +292,14 @@
         cookie["local-resource-override-is-regex"] = this._isRegex;
         cookie["local-resource-override-disabled"] = this._disabled;
     }
+
+    // Private
+
+    get _urlRegex()
+    {
+        console.assert(this._isRegex);
+        return new RegExp(this._url, !this._isCaseSensitive ? "i" : "");
+    }
 };
 
 WI.LocalResourceOverride.TypeIdentifier = "local-resource-override";

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js (294426 => 294427)


--- trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js	2022-05-18 19:48:37 UTC (rev 294426)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js	2022-05-18 20:01:09 UTC (rev 294427)
@@ -1123,7 +1123,7 @@
             break;
         }
 
-        return WI.LocalResourceOverride.create(WI.urlWithoutFragment(this.url), type, resourceData);
+        return WI.LocalResourceOverride.create(this.url, type, resourceData);
     }
 
     updateLocalResourceOverrideRequestData(data)

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js (294426 => 294427)


--- trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js	2022-05-18 19:48:37 UTC (rev 294426)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js	2022-05-18 20:01:09 UTC (rev 294427)
@@ -57,7 +57,7 @@
         // COMPATIBILITY (iOS 13.4): `Network.addInterception` did not exist yet.
         let data = {
             type: this._skipNetworkCheckbox?.checked ? WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork : this._typeSelectElement.value,
-            url: WI.urlWithoutFragment(this._urlCodeMirror.getValue()),
+            url: this._urlCodeMirror.getValue(),
             isCaseSensitive: !this._isCaseSensitiveCheckbox || this._isCaseSensitiveCheckbox.checked,
             isRegex: !!this._isRegexCheckbox?.checked,
         };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to