Chrome DevTools Protocol:如何配置RequestPattern排除服务端请求?
问题
当前需求是处理除服务端发送的请求外的所有请求,目前的做法是先捕获所有请求,再在处理器里过滤服务端请求,代码示例如下:
await client.Fetch.enable({ patterns: [ { requestStage: 'Request' }, { requestStage: 'Response' } ], // 处理所有请求和响应 }); client.Fetch.on('requestPaused', async (event: RequestPausedEvent) => { if (isServiceRoute(event.request.url)) await continueRequestOrResponse(client, event); ... // 处理必要的事件 });
想询问:能不能在client.Fetch.enable()阶段直接完成配置?比如通过设置patterns过滤器,允许所有请求(*)同时拒绝来自https://service-domain-1.company.com和https://service-domain-2.company.com的服务路由?
回答
可以直接在client.Fetch.enable()的patterns里配置过滤规则,不需要等到请求触发后再处理。Chrome DevTools Protocol的Fetch.enable方法支持用urlPattern结合否定模式实现这个需求。
具体配置思路:
- 先添加否定规则,排除指定服务域名的请求/响应
- 再添加匹配所有请求/响应的规则(因为规则按顺序匹配,先匹配到的生效,所以否定规则要放在前面)
代码示例:
await client.Fetch.enable({ patterns: [ // 排除两个服务域名的所有请求和响应 { urlPattern: "https://service-domain-1.company.com/*", requestStage: "Request", disabled: true }, { urlPattern: "https://service-domain-1.company.com/*", requestStage: "Response", disabled: true }, { urlPattern: "https://service-domain-2.company.com/*", requestStage: "Request", disabled: true }, { urlPattern: "https://service-domain-2.company.com/*", requestStage: "Response", disabled: true }, // 匹配所有剩余的请求和响应 { requestStage: "Request" }, { requestStage: "Response" } ] }); // 此时requestPaused事件只会触发非服务域名的请求,无需额外过滤 client.Fetch.on('requestPaused', async (event: RequestPausedEvent) => { ... // 直接处理必要的事件 });
关键注意点:
disabled: true表示禁用该规则的匹配,即排除符合对应urlPattern的请求- 规则顺序不能乱,否定规则必须放在匹配所有请求的规则前面,否则所有请求会先被全匹配规则捕获,否定规则失效
urlPattern支持通配符,*可匹配域名下任意子路径,确保覆盖该服务域名的所有请求
内容的提问来源于stack exchange,提问作者mlosev
相关产品推荐
相关产品推荐

