Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions packages/isomorphic/rtti.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ export function isRegExp(obj: any): obj is RegExp {
return obj instanceof RegExp || Object.prototype.toString.call(obj) === '[object RegExp]';
}

export function isRegexString(value: string): boolean {
try {
new RegExp(value);
return true;
} catch {
return false;
}
}

export function isObject(obj: any): obj is NonNullable<object> {
return typeof obj === 'object' && obj !== null;
}
Expand Down
3 changes: 2 additions & 1 deletion packages/playwright-core/src/tools/backend/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import fs from 'fs';
import * as z from 'zod';

import { getExtensionForMimeType, isTextualMimeType } from '@isomorphic/mimeType';
import { isRegexString } from '@isomorphic/rtti';

import { defineTool, defineTabTool } from './tool';

Expand All @@ -34,7 +35,7 @@ const requests = defineTabTool({
description: 'Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.',
inputSchema: z.object({
static: z.boolean().default(false).describe('Whether to include successful static resources like images, fonts, scripts, etc. Defaults to false.'),
filter: z.string().optional().describe('Only return requests whose URL matches this regexp (e.g. "/api/.*user").'),
filter: z.string().optional().refine(v => !v || isRegexString(v), { message: 'Invalid regular expression' }).describe('Only return requests whose URL matches this regexp (e.g. "/api/.*user").'),
filename: z.string().optional().describe('Filename to save the network requests to. If not provided, requests are returned as text.'),
}),
type: 'readOnly',
Expand Down
15 changes: 15 additions & 0 deletions tests/mcp/network.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,21 @@ test('browser_network_requests filter', async ({ client, server }) => {
}
});

test('browser_network_requests rejects invalid regex filter', async ({ client, server }) => {
server.setContent('/', '', 'text/html');

await client.callTool({
name: 'browser_navigate',
arguments: { url: server.PREFIX },
});

const response = await client.callTool({
name: 'browser_network_requests',
arguments: { filter: '[invalid(' },
});
expect(response.isError).toBe(true);
});

test('browser_network_requests numbers requests with stable indexes', async ({ client, server }) => {
server.setContent('/', '', 'text/html');

Expand Down
Loading