Netty Server обрабатывает HTTP 204 (без содержимого) с телом ответа - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю с приложением, использующим Spring Boot WebFlux для вызова стороннего API. этот API возвращает 204 (без содержимого) с сообщением в теле для GET, когда элемент не найден (см. скриншот ниже). Я понимаю, что сторонний API не должен возвращать 204 для элемента, который не найден, даже возвращать 204, он не должен иметь тела. но изменение этого API не вариант. Я пытаюсь выяснить, могу ли я найти решение на стороне Netty.

Если GET вызывается в первый раз, тело сообщения из HTTP204, похоже, остается в буфере, а не очищается. если GET вызывается во второй раз, Netty пытается проанализировать сообщение из буфера в версию HTTP. и выдал ошибку для следующего стека (см. ниже) 204 ответа

java .lang.IllegalArgumentException: неверный формат версии: {"MESSAGE": "INVALID at io. netty.handler.code c .http.HttpVersion. (HttpVersion. java: 120) ~ [netty-code c -http-4.1.45.Final.jar: 4.1.45.Final] в io. netty.handler.code c .http.HttpVersion.valueOf (HttpVersion. java: 77) ~ [netty-code c -http-4.1.45.Final.jar: 4.1.45.Final] в io .netty.handler.code c .http.HttpResponseDecoder.createMessage (HttpResponseDecoder. java: 118) ~ [netty-code c -http-4.1.45.Final.jar: 4.1.45.Final] в io.netty.handler.code c .http.HttpObjectDecoder.decode (HttpObjectDecoder. java: 210) ~ [netty-code c -http-4.1.45.Final.jar: 4.1.45.Final] в io.netty.handler.code c .http.HttpClientCodec $ Decoder.decode (HttpClientCode c. java: 202) ~ [netty-code c -http-4.1.45.Final.jar: 4.1.45.Final] на io.netty.handler.code c .ByteToMessageDecoder.decodeRemovalReentryProtection (ByteToMessageDecoder . java: 498) [netty-code c -4.1.45.Final.jar: 4.1.45.Final] в io.netty.handler.code c .ByteToMessageDecoder.callDecode (ByteToMessageDecoder. java : 437) [netty-code c -4.1.45.Final.jar: 4.1.45.Final] на io.netty.handler.code c .ByteToMessageDecoder.channelRead (ByteToMessageDecoder. java: 276) [ netty-код c -4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.CombinedChannelDuplexHandler.channelRead (CombinedChannelDuplexHandler. java: 251) [netty-transport-4.1.45.Final .jar: 4.1.45.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext. java: 377) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io. netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext. java: 363) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (1039ChannelRead (939) *: 355) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] на io.netty.handler.ssl.S slHandler.unwrap (SslHandler. java: 1470) [netty-handler-4.1.45.Final.jar: 4.1.45.Final] в io.netty.handler.ssl.SslHandler.decodeJdkCompatible (SslHandler. java: 1219) [netty-handler-4.1.45.Final.jar: 4.1.45.Final] по адресу io.netty.handler.ssl.SslHandler.decode (SslHandler. java: 1266) [netty-handler-4.1.45 .Final.jar: 4.1.45.Final] на io.netty.handler.code c .ByteToMessageDecoder.decodeRemovalReentryProtection (ByteToMessageDecoder. java: 498) [netty-code c -4.1.45.Final.jar : 4.1.45.Final] на io.netty.handler.code c .ByteToMessageDecoder.callDecode (ByteToMessageDecoder. java: 437) [netty-код c -4.1.45.Final.jar: 4.1.45 .Final] в io.netty.handler.code c .ByteToMessageDecoder.channelRead (ByteToMessageDecoder. java: 276) [netty-code c -4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext. java: 377) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.AbstractChannelHandlerContext.invoC lRead (AbstractChannelHandlerContext. java: 363) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.AbstractChannelHandlerContext. fireChannelRead (AbstractChannelHandlerContext. java: 355) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead (DefaultChannelPipeline. java: 1410) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] на io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext. java: 377) [netty-transport-4.1.45.Final.jar : 4.1.45.Final] на io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext. java: 363) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] на io.netty. channel.DefaultChannelPipeline.fireChannelRead (DefaultChannelPipeline. java: 919) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read (AbstractNioByCete. java: 163) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] на io.netty.channel.nio.NioEventL oop .processSelectedKey (NioEventL oop. java: 714) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] a t io.netty.channel.nio.NioEventL oop .processSelectedKeysOptimized (NioEventL oop. java: 650) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty .channel.nio.NioEventL oop .processSelectedKeys (NioEventL oop. java: 576) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] на io.netty.channel.nio .NioEventL oop .run (NioEventL oop. java: 493) [netty-transport-4.1.45.Final.jar: 4.1.45.Final] в io.netty.util.concurrent.SingleThreadEventExecutor $ 4. выполнить (SingleThreadEventExecutor. java: 989) [netty-common-4.1.45.Final.jar: 4.1.45.Final] на io.netty.util.internal.ThreadExecutorMap $ 2.run (ThreadExecutorMap. java: 74 ) [netty-common-4.1.45.Final.jar: 4.1.45.Final] на io.netty.util.concurrent.FastThreadLocalRunnable.run (FastThreadLocalRunnable. java: 30) [netty-common-4.1.45. Final.jar: 4.1.45.Final] на java .lang.Thread.run (Тема. java: 748) [na: 1.8.0_242]

...