@Override
    protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector,
            final RuleData rule) {
        RequestHandle requestHandle = RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
        if (Objects.isNull(requestHandle) || requestHandle.isEmptyConfig()) {
            LOG.error("request handler can not configuration：{}", requestHandle);
            return chain.execute(exchange);
        }
        ServerHttpRequest request = exchange.getRequest();
        ServerWebExchange modifiedExchange = exchange.mutate()
                .request(originalRequest -> originalRequest.uri(
                        UriComponentsBuilder.fromUri(exchange.getRequest()
                                .getURI())
                                .replaceQueryParams(getQueryParams(request, requestHandle))
                                .build()
                                .encode()
                                .toUri()
                        ).headers(httpHeaders -> setHeaders(httpHeaders, request, requestHandle))
                ).build();
        return chain.execute(modifiedExchange);
    }
@Test
    public void testDoExecute() {
        SelectorData selectorData = mock(SelectorData.class);
        when(this.chain.execute(any())).thenReturn(Mono.empty());

        StepVerifier.create(requestPlugin.doExecute(this.exchange, this.chain, selectorData, this.ruleData)).expectSubscription().verifyComplete();

        ArgumentCaptor<ServerWebExchange> newExchange = ArgumentCaptor.forClass(ServerWebExchange.class);
        Mockito.verify(this.chain, times(1)).execute(newExchange.capture());

        ServerHttpRequest request = newExchange.getValue().getRequest();
        assertNotNull(request);
        HttpHeaders httpHeaders = request.getHeaders();
        assertNotNull(httpHeaders);
        assertTrue(checkMapSizeAndEqualVal(httpHeaders, "addKey", "addValue"));
        assertTrue(checkMapSizeAndEqualVal(httpHeaders, "newKey", "oldValue"));
        assertTrue(checkMapSizeAndEqualVal(httpHeaders, "setKey", "newValue"));
        assertFalse(httpHeaders.containsKey("removeKey"));
        assertTrue(httpHeaders.containsKey(HttpHeaders.COOKIE));

        LinkedMultiValueMap<String, String> cookies = getCookieMapFromHeader(httpHeaders);
        assertTrue(checkMapSizeAndEqualVal(cookies, "addKey", "addValue"));
        assertTrue(checkMapSizeAndEqualVal(cookies, "newKey", "oldValue"));
        assertTrue(checkMapSizeAndEqualVal(cookies, "setKey", "newValue"));
        assertFalse(cookies.containsKey("removeKey"));

        MultiValueMap<String, String> queryParams = request.getQueryParams();
        assertNotNull(queryParams);
        assertTrue(checkMapSizeAndEqualVal(queryParams, "addKey", "addValue"));
        assertTrue(checkMapSizeAndEqualVal(queryParams, "newKey", "oldValue"));
        assertTrue(checkMapSizeAndEqualVal(queryParams, "setKey", "newValue"));
        assertFalse(queryParams.containsKey("removeKey"));
    }