- 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,
};