Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[type:bugfix] fix #4253 issue in Cryptor-Response Plugin #4331

Merged
merged 3 commits into from
Feb 8, 2023

Conversation

tian-pengfei
Copy link
Contributor

Make sure that:

  • You have read the contribution guidelines.
  • You submit test cases (unit or integration tests) that back your changes.
  • Your local test passed ./mvnw clean install -Dmaven.javadoc.skip=true.

task

  1. fixed [BUG] should stop executing plugin chain when some errors happen #4253
  2. decoupled

bug

if Cryptor-Response Plugin had errors when decrypt or encrypt, still rewrite response body
image

demonstration

  1. config

image

image

  1. test in postman

image

  1. view log
2023-01-23 15:42:29 [reactor-http-nio-2] INFO  org.apache.shenyu.plugin.base.AbstractShenyuPlugin - cryptorResponse selector success match , selector name :/**
2023-01-23 15:42:29 [reactor-http-nio-2] INFO  org.apache.shenyu.plugin.base.AbstractShenyuPlugin - cryptorResponse rule success match , rule name :all
2023-01-23 15:42:32 [reactor-http-nio-2] ERROR org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory - decrypt data error: 
java.lang.IllegalArgumentException: Last unit does not have enough valid bits
  at java.base/java.util.Base64$Decoder.decode0(Base64.java:766)
  at java.base/java.util.Base64$Decoder.decode(Base64.java:538)
  at java.base/java.util.Base64$Decoder.decode(Base64.java:561)
  at org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory.decrypt(CryptorStrategyFactory.java:96)
  at org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory.match(CryptorStrategyFactory.java:61)
  at org.apache.shenyu.plugin.cryptor.decorator.CryptorResponseDecorator.strategyMatch(CryptorResponseDecorator.java:67)
  at org.apache.shenyu.plugin.cryptor.decorator.CryptorResponseDecorator.lambda$writeWith$0(CryptorResponseDecorator.java:57)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:125)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
  at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277)
  at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400)
  at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onSubscribe(MonoCollect.java:103)
  at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178)
  at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
  at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)
  at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
  at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onSubscribe(MonoCollect.java:103)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633)
  at reactor.core.publisher.FluxJust.subscribe(FluxJust.java:68)
  at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:240)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
  at reactor.core.publisher.Operators.complete(Operators.java:137)
  at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:46)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)
  at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
  at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
  at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onNext(FluxRetryWhen.java:174)
  at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
  at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
  at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
  at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:180)
  at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
  at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
  at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:2058)
  at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.core.publisher.Operators.complete(Operators.java:137)
  at reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:176)
  at reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:143)
  at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
  at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
  at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)
  at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
  at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:400)
  at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:419)
  at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:473)
  at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:703)
  at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
  at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
  at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
  at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
  at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
  at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
  at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
  at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
  at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
  at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
  at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
  at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
  at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
  at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  at java.base/java.lang.Thread.run(Thread.java:840)
2023-01-23 15:42:32 [shenyu-netty-nio-3] ERROR org.apache.shenyu.web.handler.GlobalErrorHandler - handle error: [826a4bd4-1] Resolved [UnsupportedOperationException: null] for HTTP POST /http/test/payment
java.lang.UnsupportedOperationException: null
  at org.springframework.http.ReadOnlyHttpHeaders.remove(ReadOnlyHttpHeaders.java:131)
  Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
  *__checkpoint ⇢ org.apache.shenyu.web.configuration.ErrorHandlerConfiguration$1 [DefaultWebFilterChain]
  *__checkpoint ⇢ org.apache.shenyu.web.filter.FileSizeFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.apache.shenyu.web.filter.CrossFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
  *__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
  *__checkpoint ⇢ HTTP POST "/http/test/payment" [ExceptionHandlingWebHandler]
Original Stack Trace:
  	at org.springframework.http.ReadOnlyHttpHeaders.remove(ReadOnlyHttpHeaders.java:131)
  	at org.apache.shenyu.plugin.base.utils.ResponseUtils.fixHeaders(ResponseUtils.java:162)
  	at org.apache.shenyu.plugin.base.utils.ResponseUtils.fixBodyMessage(ResponseUtils.java:92)
  	at org.apache.shenyu.plugin.base.utils.ResponseUtils.lambda$writeWith$2(ResponseUtils.java:142)
  	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
  	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:240)
  	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
  	at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126)
  	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:181)
  	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:85)
  	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209)
  	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:238)
  	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  	at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:82)
  	at reactor.core.publisher.MonoSingle$SingleSubscriber.onComplete(MonoSingle.java:164)
  	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152)
  	at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196)
  	at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268)
  	at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126)
  	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
  	at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196)
  	at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268)
  	at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277)
  	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
  	at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89)
  	at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:230)
  	at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126)
  	at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196)
  	at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268)
  	at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:196)
  	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
  	at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571)
  	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550)
  	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
  	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
  	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605)
  	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
  	at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
  	at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717)
  	at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272)
  	at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352)
  	at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:421)
  	at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:931)
  	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:354)
  	at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895)
  	at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372)
  	at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750)
  	at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742)
  	at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728)
  	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531)
  	at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125)
  	at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356)
  	at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750)
  	at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742)
  	at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728)
  	at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127)
  	at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750)
  	at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765)
  	at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071)
  	at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174)
  	at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java)
  	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167)
  	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
  	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
  	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503)
  	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
  	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  	at java.base/java.lang.Thread.run(Thread.java:840)
2023-01-23 15:42:32 [shenyu-netty-nio-3] ERROR org.springframework.web.server.adapter.HttpWebHandlerAdapter - [826a4bd4-1] Error [java.lang.UnsupportedOperationException] for HTTP POST "/http/test/payment", but ServerHttpResponse already committed (200 OK)
......
  1. view logs after fixed
    only have error about decrypt or encrypt
2023-01-23 15:47:27 [reactor-http-nio-3] INFO  org.apache.shenyu.plugin.base.AbstractShenyuPlugin - cryptorResponse selector success match , selector name :/**
2023-01-23 15:47:27 [reactor-http-nio-3] INFO  org.apache.shenyu.plugin.base.AbstractShenyuPlugin - cryptorResponse rule success match , rule name :all
2023-01-23 15:47:27 [reactor-http-nio-3] ERROR org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory - decrypt data error: 
java.lang.IllegalArgumentException: Last unit does not have enough valid bits
  at java.base/java.util.Base64$Decoder.decode0(Base64.java:766)
  at java.base/java.util.Base64$Decoder.decode(Base64.java:538)
  at java.base/java.util.Base64$Decoder.decode(Base64.java:561)
  at org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory.decrypt(CryptorStrategyFactory.java:96)
  at org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory.match(CryptorStrategyFactory.java:61)
  at org.apache.shenyu.plugin.cryptor.utils.CryptorUtil.crypt(CryptorUtil.java:124)
  at org.apache.shenyu.plugin.cryptor.response.CryptorResponsePlugin.convert(CryptorResponsePlugin.java:82)
  at org.apache.shenyu.plugin.cryptor.response.CryptorResponsePlugin.lambda$doExecute$0(CryptorResponsePlugin.java:64)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
  at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277)
  at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400)
  at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onSubscribe(MonoCollect.java:103)
  at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178)
  at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
  at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)
  at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
  at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onSubscribe(MonoCollect.java:103)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633)
  at reactor.core.publisher.FluxJust.subscribe(FluxJust.java:68)
  at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:240)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
  at reactor.core.publisher.Operators.complete(Operators.java:137)
  at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:46)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)
  at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
  at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
  at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onNext(FluxRetryWhen.java:174)
  at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
  at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
  at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
  at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:180)
  at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
  at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
  at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:2058)
  at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.core.publisher.Operators.complete(Operators.java:137)
  at reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:176)
  at reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:143)
  at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
  at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
  at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
  at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)
  at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
  at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
  at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
  at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:400)
  at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:419)
  at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:473)
  at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:703)
  at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
  at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
  at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
  at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
  at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
  at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
  at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
  at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
  at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
  at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
  at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
  at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
  at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
  at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  at java.base/java.lang.Thread.run(Thread.java:840)

@codecov-commenter
Copy link

codecov-commenter commented Jan 23, 2023

Codecov Report

Merging #4331 (6d0171d) into master (d0b9369) will increase coverage by 0.27%.
The diff coverage is 23.80%.

@@             Coverage Diff              @@
##             master    #4331      +/-   ##
============================================
+ Coverage     68.01%   68.28%   +0.27%     
- Complexity     7484     7520      +36     
============================================
  Files          1020     1020              
  Lines         28831    28833       +2     
  Branches       2585     2584       -1     
============================================
+ Hits          19608    19689      +81     
+ Misses         7691     7608      -83     
- Partials       1532     1536       +4     
Impacted Files Coverage Δ
.../shenyu/plugin/base/support/ResponseDecorator.java 0.00% <0.00%> (ø)
...enyu/plugin/base/utils/ServerWebExchangeUtils.java 0.00% <0.00%> (ø)
...plugin/cryptor/response/CryptorResponsePlugin.java 36.36% <22.22%> (-16.97%) ⬇️
...pache/shenyu/plugin/cryptor/utils/CryptorUtil.java 35.48% <28.57%> (-2.02%) ⬇️
...u/plugin/cryptor/request/CryptorRequestPlugin.java 53.84% <100.00%> (+6.97%) ⬆️
.../client/server/consul/ShenyuConsulConfigWatch.java 60.41% <0.00%> (-25.00%) ⬇️
...va/org/apache/shenyu/plugin/cache/CachePlugin.java 81.57% <0.00%> (-7.90%) ⬇️
...ache/shenyu/plugin/grpc/cache/GrpcClientCache.java 68.75% <0.00%> (-6.25%) ⬇️
...enyu/plugin/sofa/cache/ApplicationConfigCache.java 69.72% <0.00%> (ø)
... and 38 more

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@tian-pengfei tian-pengfei changed the title fix #4253 issue in Cryptor-Response Plugin [type:bugfix] fix #4253 issue in Cryptor-Response Plugin Jan 23, 2023
@yu199195 yu199195 added type: bug Something isn't working plugin: cryptor labels Feb 8, 2023
@yu199195 yu199195 added this to the 2.6.0 milestone Feb 8, 2023
@yu199195 yu199195 merged commit 9725874 into apache:master Feb 8, 2023
@tian-pengfei tian-pengfei deleted the cryptor_reponse branch October 16, 2023 01:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
plugin: cryptor type: bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BUG] should stop executing plugin chain when some errors happen
3 participants