@Override
    protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
        JwtConfig jwtConfig = Singleton.INST.get(JwtConfig.class);
        String authorization = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
        String token = exchange.getRequest().getHeaders().getFirst(TOKEN);
        // check secreteKey
        if (StringUtils.isEmpty(jwtConfig.getSecretKey())) {
            Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.SECRET_KEY_MUST_BE_CONFIGURED);
            return WebFluxResultUtils.result(exchange, error);
        }
        // compatible processing
        String finalAuthorization = compatible(token, authorization);
        Map<String, Object> jwtBody = checkAuthorization(finalAuthorization, jwtConfig.getSecretKey());
        if (Objects.isNull(jwtBody)) {
            Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.ERROR_TOKEN);
            return WebFluxResultUtils.result(exchange, error);
        }
        return chain.execute(executeRuleHandle(rule, exchange, jwtBody));
    }
@Test
    public void testDoExecuteWithCustomHandleType() {

        ruleData.setHandle("{\"handleType\":\"custom\",\"customConvert\":\"customConvert\"}");
        jwtPluginDataHandlerUnderTest.handlerRule(ruleData);
        when(this.chain.execute(any())).thenReturn(Mono.empty());

        Mono<Void> mono = jwtPluginUnderTest.doExecute(exchange, chain, selectorData, ruleData);

        StepVerifier.create(mono).expectSubscription().verifyComplete();

        verify(chain)
                .execute(argThat(exchange -> hasHeader(exchange, "custom", "customConvert")));
    }