-
Bug
-
Resolution: Unresolved
-
P4
-
None
-
26
Spotted in the H3MalformedResponseTest logs: when the server sends an invalid value in the content-length header, the send method fails with an IllegalArgumentException:
java.lang.IllegalArgumentException: For input string: "a"
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:981)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
at H3MalformedResponseTest.testMalformedResponse(H3MalformedResponseTest.java:368)
[...]
Caused by: java.lang.NumberFormatException: For input string: "a"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Long.parseLong(Long.java:594)
at java.base/java.lang.Long.parseLong(Long.java:698)
at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:248)
at java.base/java.util.Collections$2.tryAdvance(Collections.java:5184)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:147)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:588)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:574)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:538)
at java.net.http/java.net.http.HttpHeaders.firstValueAsLong(HttpHeaders.java:97)
at java.net.http/jdk.internal.net.http.Http3Stream.handleResponse(Http3Stream.java:657)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl.handleResponse(Http3ExchangeImpl.java:1243)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl$HeadersConsumer.headersCompleted(Http3ExchangeImpl.java:242)
at java.net.http/jdk.internal.net.http.Http3Stream$StreamHeadersConsumer.onComplete(Http3Stream.java:175)
at java.net.http/jdk.internal.net.http.qpack.readers.HeaderFrameReader.readLoop0(HeaderFrameReader.java:255)
at java.net.http/jdk.internal.net.http.qpack.readers.HeaderFrameReader.readLoop(HeaderFrameReader.java:124)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:280)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:233)
at java.net.http/jdk.internal.net.http.qpack.readers.HeaderFrameReader.read(HeaderFrameReader.java:341)
at java.net.http/jdk.internal.net.http.qpack.Decoder.decodeHeader(Decoder.java:265)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl.receiveHeaders(Http3ExchangeImpl.java:1629)
at java.net.http/jdk.internal.net.http.Http3Stream.processQuicData(Http3Stream.java:430)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl.processQuicData(Http3ExchangeImpl.java:1369)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
... 1 more
It should throw a ProtocolException instead. All uses of HttpHeaders.firstValueAsLong should be reviewed for proper exception handling.
java.lang.IllegalArgumentException: For input string: "a"
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:981)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
at H3MalformedResponseTest.testMalformedResponse(H3MalformedResponseTest.java:368)
[...]
Caused by: java.lang.NumberFormatException: For input string: "a"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Long.parseLong(Long.java:594)
at java.base/java.lang.Long.parseLong(Long.java:698)
at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:248)
at java.base/java.util.Collections$2.tryAdvance(Collections.java:5184)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:147)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:588)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:574)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:538)
at java.net.http/java.net.http.HttpHeaders.firstValueAsLong(HttpHeaders.java:97)
at java.net.http/jdk.internal.net.http.Http3Stream.handleResponse(Http3Stream.java:657)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl.handleResponse(Http3ExchangeImpl.java:1243)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl$HeadersConsumer.headersCompleted(Http3ExchangeImpl.java:242)
at java.net.http/jdk.internal.net.http.Http3Stream$StreamHeadersConsumer.onComplete(Http3Stream.java:175)
at java.net.http/jdk.internal.net.http.qpack.readers.HeaderFrameReader.readLoop0(HeaderFrameReader.java:255)
at java.net.http/jdk.internal.net.http.qpack.readers.HeaderFrameReader.readLoop(HeaderFrameReader.java:124)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:280)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:233)
at java.net.http/jdk.internal.net.http.qpack.readers.HeaderFrameReader.read(HeaderFrameReader.java:341)
at java.net.http/jdk.internal.net.http.qpack.Decoder.decodeHeader(Decoder.java:265)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl.receiveHeaders(Http3ExchangeImpl.java:1629)
at java.net.http/jdk.internal.net.http.Http3Stream.processQuicData(Http3Stream.java:430)
at java.net.http/jdk.internal.net.http.Http3ExchangeImpl.processQuicData(Http3ExchangeImpl.java:1369)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
... 1 more
It should throw a ProtocolException instead. All uses of HttpHeaders.firstValueAsLong should be reviewed for proper exception handling.