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

ExternalService handler cannot handle empty body #1372

Closed
DiogoFKT opened this issue Sep 19, 2022 · 2 comments
Closed

ExternalService handler cannot handle empty body #1372

DiogoFKT opened this issue Sep 19, 2022 · 2 comments

Comments

@DiogoFKT
Copy link
Contributor

ExternalServiceHandler throws 500 when non-null empty body exists in inputStream - must return 400 instead

@stevehu
Copy link
Contributor

stevehu commented Sep 20, 2022

Added a test case trying to reproduce the issue and I am guessing this is the case.

08:24:09.904 [XNIO-1 I/O-11] DEBUG io.undertow.request - Upgrading request HttpServerExchange{ POST /post}
08:24:09.915 [Client I/O-1] DEBUG io.undertow.client.http.HttpClientConnection - connection to localhost/127.0.0.1:7080 is being upgraded
08:24:09.944 [XNIO-1 task-1] DEBUG io.undertow.request.error-response - Setting error code 500 for exchange HttpServerExchange{ POST /post}
java.lang.RuntimeException: null
	at io.undertow.server.HttpServerExchange.setStatusCode(HttpServerExchange.java:1484)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:420)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1349)
	at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
	at java.base/java.lang.Thread.run(Thread.java:834)
08:24:09.944 [XNIO-1 task-1] ERROR io.undertow.request - UT005071: Undertow request failed HttpServerExchange{ POST /post}
java.lang.NullPointerException: null
	at java.net.http/jdk.internal.net.http.RequestPublishers$StringPublisher.<init>(RequestPublishers.java:202)
	at java.net.http/java.net.http.HttpRequest$BodyPublishers.ofString(HttpRequest.java:565)
	at java.net.http/java.net.http.HttpRequest$BodyPublishers.ofString(HttpRequest.java:553)
	at com.networknt.proxy.ExternalServiceHandler.handleRequest(ExternalServiceHandler.java:143)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1349)
	at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
	at java.base/java.lang.Thread.run(Thread.java:834)
08:24:09.949 [main] DEBUG io.undertow.client.http.HttpClientConnection - close called on connection to localhost/127.0.0.1:7080
08:24:09.951 [Client I/O-1] DEBUG io.undertow.client.http.HttpClientConnection - connection to localhost/127.0.0.1:7080 closed
statusCode = 500 body = 

java.lang.AssertionError: 
Expected :200
Actual   :500
<Click to see difference>


	at org.junit.Assert.fail(Assert.java:89)
	at org.junit.Assert.failNotEquals(Assert.java:835)
	at org.junit.Assert.assertEquals(Assert.java:647)
	at org.junit.Assert.assertEquals(Assert.java:633)
	at com.networknt.proxy.ExternalServiceHandlerTest.testEmptyPostBodyRequest(ExternalServiceHandlerTest.java:164)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

@DiogoFKT
Copy link
Contributor Author

DiogoFKT commented Sep 20, 2022

That's correct - here's my stack trace

14:40:52.133 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w TRACE c.n.proxy.ExternalServiceHandler:113 handleRequest - Get post body from input stream = null
14:40:52.141 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w ERROR c.n.exception.ExceptionHandler:78 handleRequest - Exception:
java.lang.NullPointerException: null
        at java.net.http/jdk.internal.net.http.RequestPublishers$StringPublisher.<init>(RequestPublishers.java:202)
        at java.net.http/java.net.http.HttpRequest$BodyPublishers.ofString(HttpRequest.java:565)
        at java.net.http/java.net.http.HttpRequest$BodyPublishers.ofString(HttpRequest.java:553)
        at com.networknt.proxy.ExternalServiceHandler.handleRequest(ExternalServiceHandler.java:115)
        at com.networknt.handler.Handler.next(Handler.java:212)
        at com.networknt.handler.Handler.next(Handler.java:233)
        at com.networknt.cors.CorsHttpHandler.handleRequest(CorsHttpHandler.java:74)
        at com.networknt.handler.Handler.next(Handler.java:212)
        at com.networknt.handler.Handler.next(Handler.java:233)
        at com.networknt.correlation.CorrelationHandler.handleRequest(CorrelationHandler.java:77)
        at com.networknt.handler.Handler.next(Handler.java:212)
        at com.networknt.handler.Handler.next(Handler.java:233)
        at com.networknt.traceability.TraceabilityHandler.handleRequest(TraceabilityHandler.java:68)
        at com.networknt.handler.Handler.next(Handler.java:212)
        at com.networknt.handler.Handler.next(Handler.java:233)
        at com.networknt.chaos.MemoryAssaultHandler.handleRequest(MemoryAssaultHandler.java:36)
        at com.networknt.handler.Handler.next(Handler.java:212)
        at com.networknt.handler.Handler.next(Handler.java:233)
        at com.networknt.exception.ExceptionHandler.handleRequest(ExceptionHandler.java:76)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
        at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)
        at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
        at java.base/java.lang.Thread.run(Thread.java:834)
14:40:52.145 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w INFO  c.n.config.Config$FileConfigImpl:649 loadJsonMapConfigWithSpecificConfigLoader - Trying to load status with extension yaml, yml or json by using default loading method.
14:40:52.146 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w INFO  c.n.config.Config$FileConfigImpl:508 getConfigStream - Unable to load config from externalized folder for status.yml in C:\\Users\\p039\\Code\\eadp-corp-gateway\\dev\\sv0a0628\\config
14:40:52.147 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w INFO  c.n.config.Config$FileConfigImpl:521 getConfigStream - Trying to load config from classpath directory for file status.yml
14:40:52.148 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w INFO  c.n.config.Config$FileConfigImpl:533 getConfigStream - Config loaded from default folder for status.yml
14:40:52.169 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w DEBUG o.j.logging.DelegatingBasicLogger:424 debugf - Setting error code 500 for exchange HttpServerExchange{ POST /dev/employee/leave/continuous}
java.lang.RuntimeException: null
        at io.undertow.server.HttpServerExchange.setStatusCode(HttpServerExchange.java:1484)
        at com.networknt.handler.LightHttpHandler.setExchangeStatus(LightHttpHandler.java:111)
        at com.networknt.handler.LightHttpHandler.setExchangeStatus(LightHttpHandler.java:73)
        at com.networknt.exception.ExceptionHandler.handleRequest(ExceptionHandler.java:90)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
        at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)
        at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
        at java.base/java.lang.Thread.run(Thread.java:834)
14:40:52.174 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w ERROR c.networknt.handler.LightHttpHandler:116 setExchangeStatus - {"statusCode":500,"code":"ERR10010","message":"RUNTIME_EXCEPTION","description":"Unexpected runtime exception","severity":"ERROR"}
14:40:52.185 [XNIO-1 task-1]  eUrTi3OaSPWtdgobEtYP7w TRACE c.networknt.handler.LightHttpHandler:122 setExchangeStatus - java.base/java.lang.Thread.getStackTrace(Thread.java:1606)
com.networknt.handler.LightHttpHandler.setExchangeStatus(LightHttpHandler.java:114)
com.networknt.handler.LightHttpHandler.setExchangeStatus(LightHttpHandler.java:73)
com.networknt.exception.ExceptionHandler.handleRequest(ExceptionHandler.java:90)
io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)
org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
java.base/java.lang.Thread.run(Thread.java:834)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants