Skip to content

Commit 8dde1c2

Browse files
Garima ChadhaDevtools-frontend LUCI CQ
authored andcommitted
Add Request Header Filter Function
This change introduces a new function, `requestRequestHeaderFilter`, which filters request headers based on the provided header name. The function checks if any header in the request matches the specified header name, ignoring case sensitivity. Bug: 397481040 Change-Id: Ie220b4a12f85679693111cb31ccc783b858e9547 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6512390 Auto-Submit: Garima Chadha <garimachadha@microsoft.com> Reviewed-by: Wolfgang Beyer <wolfi@chromium.org> Commit-Queue: Wolfgang Beyer <wolfi@chromium.org> Reviewed-by: Simon Zünd <szuend@chromium.org> Reviewed-by: Robert Paveza <Rob.Paveza@microsoft.com>
1 parent fa13103 commit 8dde1c2

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

front_end/panels/network/NetworkLogView.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,54 @@ describeWithMockConnection('NetworkLogView', () => {
657657
]);
658658
});
659659

660+
function createRequestsWithAndWithoutTestHeader() {
661+
const urlWithTestHeader = urlString`https://example.com/request-with-test-header`;
662+
const urlWithoutTestHeader = urlString`https://example.com/request-without-test-header`;
663+
664+
const requestWithHeader = createNetworkRequest(urlWithTestHeader, {target});
665+
const requestWithoutHeader = createNetworkRequest(urlWithoutTestHeader, {target});
666+
667+
requestWithHeader.requestHeaders = () => [{name: 'Accept-Language', value: 'US'}];
668+
requestWithoutHeader.requestHeaders = () => [{name: 'Cache-Control', value: 'public'}];
669+
670+
return {
671+
urlWithTestHeader,
672+
urlWithoutTestHeader,
673+
};
674+
}
675+
676+
it('filters requests with has-request-header', async () => {
677+
const {urlWithTestHeader} = createRequestsWithAndWithoutTestHeader();
678+
679+
const filterBar = new UI.FilterBar.FilterBar('network-panel', true);
680+
networkLogView = createNetworkLogView(filterBar);
681+
networkLogView.setTextFilterValue('has-request-header:Accept-Language');
682+
683+
networkLogView.markAsRoot();
684+
networkLogView.show(document.body);
685+
686+
const rootNode = networkLogView.columns().dataGrid().rootNode();
687+
const visibleUrls = rootNode.children.map(n => (n as Network.NetworkDataGridNode.NetworkNode).request()?.url());
688+
689+
assert.deepEqual(visibleUrls, [urlWithTestHeader]);
690+
});
691+
692+
it('does not match any request if header name is not present', async () => {
693+
createRequestsWithAndWithoutTestHeader();
694+
695+
const filterBar = new UI.FilterBar.FilterBar('network-panel', true);
696+
networkLogView = createNetworkLogView(filterBar);
697+
networkLogView.setTextFilterValue('has-request-header:Nonexistent-Header');
698+
699+
networkLogView.markAsRoot();
700+
networkLogView.show(document.body);
701+
702+
const rootNode = networkLogView.columns().dataGrid().rootNode();
703+
const visibleUrls = rootNode.children.map(n => (n as Network.NetworkDataGridNode.NetworkNode).request()?.url());
704+
705+
assert.deepEqual(visibleUrls, []);
706+
});
707+
660708
it('filters localized resource categories', async () => {
661709
// "simulate" other locale by stubbing out resource categories with a different text
662710
sinon.stub(Common.ResourceType.resourceCategories.Document, 'title')

front_end/panels/network/NetworkLogView.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,10 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
737737
return request.responseHeaderValue(value) !== undefined;
738738
}
739739

740+
private static requestRequestHeaderFilter(headerName: string, request: SDK.NetworkRequest.NetworkRequest): boolean {
741+
return request.requestHeaders().some(header => header.name.toLowerCase() === headerName.toLowerCase());
742+
}
743+
740744
private static requestResponseHeaderSetCookieFilter(value: string, request: SDK.NetworkRequest.NetworkRequest):
741745
boolean {
742746
// Multiple Set-Cookie headers in the request are concatenated via space. Only
@@ -1652,6 +1656,10 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
16521656
}
16531657
}
16541658

1659+
for (const header of request.requestHeaders()) {
1660+
this.suggestionBuilder.addItem(NetworkForward.UIFilter.FilterType.HasRequestHeader, header.name);
1661+
}
1662+
16551663
for (const cookie of request.responseCookies) {
16561664
this.suggestionBuilder.addItem(NetworkForward.UIFilter.FilterType.SetCookieDomain, cookie.domain());
16571665
this.suggestionBuilder.addItem(NetworkForward.UIFilter.FilterType.SetCookieName, cookie.name());
@@ -2043,6 +2051,9 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
20432051
case NetworkForward.UIFilter.FilterType.ResponseHeaderValueSetCookie:
20442052
return NetworkLogView.requestResponseHeaderSetCookieFilter.bind(null, value);
20452053

2054+
case NetworkForward.UIFilter.FilterType.HasRequestHeader:
2055+
return NetworkLogView.requestRequestHeaderFilter.bind(null, value);
2056+
20462057
case NetworkForward.UIFilter.FilterType.Is:
20472058
if (value.toLowerCase() === NetworkForward.UIFilter.IsFilterType.RUNNING) {
20482059
return NetworkLogView.runningRequestFilter;

front_end/panels/network/forward/UIFilter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export enum FilterType {
66
/* eslint-disable @typescript-eslint/naming-convention -- Used by web_tests. */
77
Domain = 'domain',
88
HasResponseHeader = 'has-response-header',
9+
HasRequestHeader = 'has-request-header',
910
HasOverrides = 'has-overrides',
1011
ResponseHeaderValueSetCookie = 'response-header-set-cookie',
1112
Is = 'is',

0 commit comments

Comments
 (0)