Skip to content

Commit 8a8b83c

Browse files
authored
Merge pull request #53311 from geoand/#37483
Log cause of HTTP 400 by default in dev and test mode
2 parents 4fd5705 + 8d3d0bf commit 8a8b83c

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ResteasyReactiveProcessor.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.jboss.jandex.MethodInfo;
7171
import org.jboss.jandex.Type;
7272
import org.jboss.logging.Logger;
73+
import org.jboss.logmanager.Level;
7374
import org.jboss.resteasy.reactive.common.core.Serialisers;
7475
import org.jboss.resteasy.reactive.common.core.SingletonBeanFactory;
7576
import org.jboss.resteasy.reactive.common.model.InjectableBean;
@@ -99,6 +100,7 @@
99100
import org.jboss.resteasy.reactive.server.core.DeploymentInfo;
100101
import org.jboss.resteasy.reactive.server.core.ExceptionMapping;
101102
import org.jboss.resteasy.reactive.server.core.ServerSerialisers;
103+
import org.jboss.resteasy.reactive.server.handlers.ParameterHandler;
102104
import org.jboss.resteasy.reactive.server.handlers.RestInitialHandler;
103105
import org.jboss.resteasy.reactive.server.model.ContextResolvers;
104106
import org.jboss.resteasy.reactive.server.model.DelegatingServerRestHandler;
@@ -151,6 +153,7 @@
151153
import io.quarkus.deployment.builditem.FeatureBuildItem;
152154
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
153155
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
156+
import io.quarkus.deployment.builditem.LogCategoryBuildItem;
154157
import io.quarkus.deployment.builditem.RecordableConstructorBuildItem;
155158
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
156159
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
@@ -299,6 +302,14 @@ MethodScannerBuildItem responseHeaderSupport() {
299302
return new MethodScannerBuildItem(new ResponseHeaderMethodScanner());
300303
}
301304

305+
@BuildStep
306+
void configureLogLevels(BuildProducer<LogCategoryBuildItem> producer, LaunchModeBuildItem launchMode) {
307+
if (!launchMode.getLaunchMode().isDevOrTest()) {
308+
return;
309+
}
310+
producer.produce(new LogCategoryBuildItem(ParameterHandler.class.getName(), Level.DEBUG));
311+
}
312+
302313
@BuildStep
303314
void vertxIntegration(BuildProducer<MessageBodyWriterBuildItem> writerBuildItemBuildProducer) {
304315
writerBuildItemBuildProducer.produce(new MessageBodyWriterBuildItem(ServerVertxBufferMessageBodyWriter.class.getName(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.quarkus.resteasy.reactive.server.test;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.logging.LogRecord;
6+
import java.util.stream.Collectors;
7+
8+
import jakarta.ws.rs.GET;
9+
import jakarta.ws.rs.HeaderParam;
10+
import jakarta.ws.rs.Path;
11+
12+
import org.jboss.logmanager.Level;
13+
import org.jboss.resteasy.reactive.server.handlers.ParameterHandler;
14+
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.api.extension.RegisterExtension;
16+
17+
import io.quarkus.test.QuarkusExtensionTest;
18+
import io.restassured.RestAssured;
19+
20+
/**
21+
* Verifies that parameter conversion errors are logged at DEBUG level in dev/test mode,
22+
* so that the root cause of HTTP 400 responses is visible without manual log configuration.
23+
*/
24+
public class ParameterHandlerDebugLogTest {
25+
26+
@RegisterExtension
27+
static QuarkusExtensionTest test = new QuarkusExtensionTest()
28+
.withApplicationRoot(jar -> jar.addClasses(TestResource.class))
29+
.setLogRecordPredicate(record -> record.getLoggerName().equals(ParameterHandler.class.getName())
30+
&& record.getLevel().equals(Level.DEBUG))
31+
.assertLogRecords(records -> {
32+
var messages = records.stream().map(LogRecord::getMessage).collect(Collectors.toList());
33+
assertThat(messages).anySatisfy(msg -> assertThat(msg).contains("Unable to handle parameter"));
34+
});
35+
36+
@Test
37+
public void testBadHeaderParamLogsDebug() {
38+
RestAssured
39+
.given()
40+
.header("X-Number", "not-a-number")
41+
.get("/test/header")
42+
.then()
43+
.statusCode(400);
44+
}
45+
46+
@Path("/test")
47+
public static class TestResource {
48+
49+
@GET
50+
@Path("/header")
51+
public String header(@HeaderParam("X-Number") int number) {
52+
return "number=" + number;
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)