Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8369595

HttpClient.send throws unexpected exceptions

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • None
    • 26
    • core-libs

      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.

            djelinski Daniel Jelinski
            djelinski Daniel Jelinski
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: