Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,28 @@

import io.micronaut.context.annotation.Property
import io.micronaut.context.annotation.Requires
import io.micronaut.core.annotation.NonNull
import io.micronaut.core.annotation.Nullable
import io.micronaut.core.type.Argument
import io.micronaut.core.type.Headers
import io.micronaut.core.type.MutableHeaders
import io.micronaut.http.HttpRequest
import io.micronaut.http.HttpResponse
import io.micronaut.http.HttpStatus
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Body
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Header
import io.micronaut.http.annotation.Post
import io.micronaut.http.annotation.RequestFilter
import io.micronaut.http.annotation.ServerFilter
import io.micronaut.http.body.TypedMessageBodyHandler
import io.micronaut.http.body.TypedMessageBodyWriter
import io.micronaut.http.client.HttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.http.client.exceptions.HttpClientResponseException
import io.micronaut.http.codec.CodecException
import io.micronaut.http.filter.FilterContinuation
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import jakarta.inject.Inject
Expand Down Expand Up @@ -45,6 +55,16 @@
response == 'application/json {"foo":10}'
}

void "test response body mutating filter"() {
when:
def post = HttpRequest.GET("/request-filter/mutating")
def response = client.toBlocking().exchange(post, String.class)

Check failure on line 61 in http-server-jetty/src/test/groovy/io/micronaut/servlet/jetty/filters/RequestFilterBodySpec.groovy

View workflow job for this annotation

GitHub Actions / Java CI / Test Report (17)

RequestFilterBodySpec.test response body mutating filter

io.micronaut.http.client.exceptions.HttpClientResponseException: Client '/': Unauthorized
Raw output
io.micronaut.http.client.exceptions.HttpClientResponseException: Client '/': Unauthorized
	at app//io.micronaut.http.client.netty.DefaultHttpClient.makeErrorFromRequestBody(DefaultHttpClient.java:2086)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.handleExchangeResponse(DefaultHttpClient.java:929)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchange$8(DefaultHttpClient.java:882)
	at app//io.micronaut.core.execution.ImperativeExecutionFlowImpl.flatMap(ImperativeExecutionFlowImpl.java:72)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchange$9(DefaultHttpClient.java:882)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.lambda$sendRequestWithRedirectsNoFilter$46(DefaultHttpClient.java:1625)
	at app//reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:132)
	at app//reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245)
	at app//reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305)
	at app//reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onNext(MonoSubscribeOn.java:146)
	at app//reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:176)
	at app//io.micronaut.http.client.netty.DefaultHttpClient$6.complete(DefaultHttpClient.java:1709)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler$BufferedContent.complete(Http1ResponseHandler.java:222)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler$BufferedContent.read(Http1ResponseHandler.java:183)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler$BufferedContent.read(Http1ResponseHandler.java:157)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler.channelReadInstrumented(Http1ResponseHandler.java:73)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler.channelReadInstrumented(Http1ResponseHandler.java:48)
	at app//io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:46)
	at app//io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:107)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
	at app//io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
	at app//io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
	at app//io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
	at app//io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at app//io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at app//io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
	at app//io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at app//io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at app//io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at app//io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at [email protected]/java.lang.Thread.run(Thread.java:842)
	Suppressed: java.lang.Exception: #block terminated with an error
		at app//reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104)
		at app//reactor.core.publisher.Mono.block(Mono.java:1779)
		at app//io.micronaut.http.client.netty.DefaultHttpClient$1.exchange(DefaultHttpClient.java:615)
		at app//io.micronaut.http.client.BlockingHttpClient.exchange(BlockingHttpClient.java:77)
		at app//io.micronaut.http.client.BlockingHttpClient.exchange(BlockingHttpClient.java:106)
		at app//org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
		at app//io.micronaut.servlet.jetty.filters.RequestFilterBodySpec.$spock_feature_0_1(RequestFilterBodySpec.groovy:61)
		at [email protected]/java.lang.reflect.Method.invoke(Method.java:568)
		at app//org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:187)
		at app//org.spockframework.runtime.model.MethodInfo.lambda$new$0(MethodInfo.java:49)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:102)
		at app//io.micronaut.test.extensions.spock.MicronautSpockExtension.lambda$visitSpecAnnotation$0(MicronautSpockExtension.java:77)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:398)
		at app//org.spockframework.runtime.PlatformSpecRunner.runFeatureMethod(PlatformSpecRunner.java:324)
		at app//org.spockframework.runtime.IterationNode.execute(IterationNode.java:50)
		at app//org.spockframework.runtime.SimpleFeatureNode.execute(SimpleFeatureNode.java:58)
		at app//org.spockframework.runtime.SimpleFeatureNode.execute(SimpleFeatureNode.java:15)
		at app//org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at app//org.spockframework.runtime.IterationNode.lambda$around$0(IterationNode.java:67)
		at app//org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunIteration$5(PlatformSpecRunner.java:236)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:407)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:390)
		at app//org.spockframework.runtime.PlatformSpecRunner.runIteration(PlatformSpecRunner.java:218)
		at app//org.spockframework.runtime.IterationNode.around(IterationNode.java:67)
		at app//org.spockframework.runtime.SimpleFeatureNode.lambda$around$0(SimpleFeatureNode.java:52)
		at app//org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at app//org.spockframework.runtime.FeatureNode.lambda$around$0(FeatureNode.java:41)
		at app//org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunFeature$4(PlatformSpecRunner.java:199)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:102)
		at app//io.micronaut.test.extensions.spock.MicronautSpockExtension$3.proceed(MicronautSpockExtension.java:199)
		at app//io.micronaut.test.extensions.AbstractMicronautExtension.interceptEach(AbstractMicronautExtension.java:162)
		at app//io.micronaut.test.extensions.AbstractMicronautExtension.interceptTest(AbstractMicronautExtension.java:119)
		at app//io.micronaut.test.extensions.spock.MicronautSpockExtension.getInvocationInterceptor(MicronautSpockExtension.java:191)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:398)
		at app//org.spockframework.runtime.PlatformSpecRunner.runFeature(PlatformSpecRunner.java:192)
		at app//org.spockframework.runtime.FeatureNode.around(FeatureNode.java:41)
		at app//org.spockframework.runtime.SimpleFeatureNode.around(SimpleFeatureNode.java:52)
		at app//org.spockframework.runtime.SimpleFeatureNode.around(SimpleFeatureNode.java:15)
		at [email protected]/java.util.ArrayList.forEach(ArrayList.java:1511)
		at app//org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at app//org.spockframework.runtime.SpecNode.lambda$around$0(SpecNode.java:63)
		at app//org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunSpec$0(PlatformSpecRunner.java:61)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:407)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:390)
		at app//org.spockframework.runtime.PlatformSpecRunner.runSpec(PlatformSpecRunner.java:55)
		at app//org.spockframework.runtime.SpecNode.around(SpecNode.java:63)
		at app//org.spockframework.runtime.SpecNode.around(SpecNode.java:11)
		at [email protected]/java.util.ArrayList.forEach(ArrayList.java:1511)

Check failure on line 61 in http-server-jetty/src/test/groovy/io/micronaut/servlet/jetty/filters/RequestFilterBodySpec.groovy

View workflow job for this annotation

GitHub Actions / Java CI / Test Report (21)

RequestFilterBodySpec.test response body mutating filter

io.micronaut.http.client.exceptions.HttpClientResponseException: Client '/': Unauthorized
Raw output
io.micronaut.http.client.exceptions.HttpClientResponseException: Client '/': Unauthorized
	at app//io.micronaut.http.client.netty.DefaultHttpClient.makeErrorFromRequestBody(DefaultHttpClient.java:2086)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.handleExchangeResponse(DefaultHttpClient.java:929)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchange$8(DefaultHttpClient.java:882)
	at app//io.micronaut.core.execution.ImperativeExecutionFlowImpl.flatMap(ImperativeExecutionFlowImpl.java:72)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchange$9(DefaultHttpClient.java:882)
	at app//io.micronaut.http.client.netty.DefaultHttpClient.lambda$sendRequestWithRedirectsNoFilter$46(DefaultHttpClient.java:1625)
	at app//reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:132)
	at app//reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245)
	at app//reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305)
	at app//reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onNext(MonoSubscribeOn.java:146)
	at app//reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:176)
	at app//io.micronaut.http.client.netty.DefaultHttpClient$6.complete(DefaultHttpClient.java:1709)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler$BufferedContent.complete(Http1ResponseHandler.java:222)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler$BufferedContent.read(Http1ResponseHandler.java:183)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler$BufferedContent.read(Http1ResponseHandler.java:157)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler.channelReadInstrumented(Http1ResponseHandler.java:73)
	at app//io.micronaut.http.client.netty.Http1ResponseHandler.channelReadInstrumented(Http1ResponseHandler.java:48)
	at app//io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:46)
	at app//io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:107)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
	at app//io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
	at app//io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
	at app//io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at app//io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at app//io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
	at app//io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at app//io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at app//io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
	at app//io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at app//io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at app//io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at app//io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at [email protected]/java.lang.Thread.run(Thread.java:1583)
	Suppressed: java.lang.Exception: #block terminated with an error
		at app//reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104)
		at app//reactor.core.publisher.Mono.block(Mono.java:1779)
		at app//io.micronaut.http.client.netty.DefaultHttpClient$1.exchange(DefaultHttpClient.java:615)
		at app//io.micronaut.http.client.BlockingHttpClient.exchange(BlockingHttpClient.java:77)
		at app//io.micronaut.http.client.BlockingHttpClient.exchange(BlockingHttpClient.java:106)
		at app//org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
		at app//io.micronaut.servlet.jetty.filters.RequestFilterBodySpec.$spock_feature_0_1(RequestFilterBodySpec.groovy:61)
		at [email protected]/java.lang.reflect.Method.invoke(Method.java:580)
		at app//org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:187)
		at app//org.spockframework.runtime.model.MethodInfo.lambda$new$0(MethodInfo.java:49)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:102)
		at app//io.micronaut.test.extensions.spock.MicronautSpockExtension.lambda$visitSpecAnnotation$0(MicronautSpockExtension.java:77)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:398)
		at app//org.spockframework.runtime.PlatformSpecRunner.runFeatureMethod(PlatformSpecRunner.java:324)
		at app//org.spockframework.runtime.IterationNode.execute(IterationNode.java:50)
		at app//org.spockframework.runtime.SimpleFeatureNode.execute(SimpleFeatureNode.java:58)
		at app//org.spockframework.runtime.SimpleFeatureNode.execute(SimpleFeatureNode.java:15)
		at app//org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at app//org.spockframework.runtime.IterationNode.lambda$around$0(IterationNode.java:67)
		at app//org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunIteration$5(PlatformSpecRunner.java:236)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:407)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:390)
		at app//org.spockframework.runtime.PlatformSpecRunner.runIteration(PlatformSpecRunner.java:218)
		at app//org.spockframework.runtime.IterationNode.around(IterationNode.java:67)
		at app//org.spockframework.runtime.SimpleFeatureNode.lambda$around$0(SimpleFeatureNode.java:52)
		at app//org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at app//org.spockframework.runtime.FeatureNode.lambda$around$0(FeatureNode.java:41)
		at app//org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunFeature$4(PlatformSpecRunner.java:199)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:102)
		at app//io.micronaut.test.extensions.spock.MicronautSpockExtension$3.proceed(MicronautSpockExtension.java:199)
		at app//io.micronaut.test.extensions.AbstractMicronautExtension.interceptEach(AbstractMicronautExtension.java:162)
		at app//io.micronaut.test.extensions.AbstractMicronautExtension.interceptTest(AbstractMicronautExtension.java:119)
		at app//io.micronaut.test.extensions.spock.MicronautSpockExtension.getInvocationInterceptor(MicronautSpockExtension.java:191)
		at app//org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:398)
		at app//org.spockframework.runtime.PlatformSpecRunner.runFeature(PlatformSpecRunner.java:192)
		at app//org.spockframework.runtime.FeatureNode.around(FeatureNode.java:41)
		at app//org.spockframework.runtime.SimpleFeatureNode.around(SimpleFeatureNode.java:52)
		at app//org.spockframework.runtime.SimpleFeatureNode.around(SimpleFeatureNode.java:15)
		at [email protected]/java.util.ArrayList.forEach(ArrayList.java:1596)
		at app//org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at app//org.spockframework.runtime.SpecNode.lambda$around$0(SpecNode.java:63)
		at app//org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunSpec$0(PlatformSpecRunner.java:61)
		at app//org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
		at app//org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:407)
		at app//org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:390)
		at app//org.spockframework.runtime.PlatformSpecRunner.runSpec(PlatformSpecRunner.java:55)
		at app//org.spockframework.runtime.SpecNode.around(SpecNode.java:63)
		at app//org.spockframework.runtime.SpecNode.around(SpecNode.java:11)
		at [email protected]/java.util.ArrayList.forEach(ArrayList.java:1596)

then:
response != null
response.status() == HttpStatus.BAD_REQUEST
}

@ServerFilter
@Singleton
@Requires(property = "spec.name", value = RequestFilterBodySpec.SPEC_NAME)
Expand All @@ -60,6 +80,33 @@
events.add("binding " + contentType + " " + new String(bytes, StandardCharsets.UTF_8))
continuation.proceed()
}

@RequestFilter("/request-filter/mutating")
HttpResponse<?> mutatingFilter() {
return HttpResponse.unauthorized().body(
new CustomException("something bad")
)
}
}

static class CustomException extends RuntimeException {
CustomException(String message) {
super(message)
}
}

@Requires(property = "spec.name", value = SPEC_NAME)
@Singleton
static class CustomExceptionWriter implements TypedMessageBodyWriter<CustomException> {
@Override
Argument<CustomException> getType() {
return Argument.of(CustomException.class)
}

@Override
void writeTo(@NonNull Argument<CustomException> type, @NonNull MediaType mediaType, CustomException object, @NonNull MutableHeaders outgoingHeaders, @NonNull OutputStream outputStream) throws CodecException {
outputStream.write(object.getMessage().getBytes(StandardCharsets.UTF_8))
}
}

@Controller
Expand All @@ -70,5 +117,10 @@
String requestFilterBinding(@Header String contentType, @Body byte[] bytes) {
contentType + " " + new String(bytes, StandardCharsets.UTF_8)
}

@Get("/request-filter/mutating")
String responseMutating() {
return "ok"
}
}
}
Loading