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

HttpClient synchronous send should recreate exceptions before throwing

XMLWordPrintable

      The HttpClient implementation of synchronous send simple delegates to the asynchronous send and does a blocking `get` on the returned completable future. Exceptions, if they occur, are unwrapped to remove any potential CompletionException that may have been added by the CompletableFuture. This unwrapping is fine, but the underlying Exception may not contain any of the callers stack frames. This may appear odd and be more difficult to diagnose if not being handled locally.

      Consider recreating a new appropriate Exception type to wrap the underlying exception and throw it, since it will contain the caller stack frames.

      Example exception from a synchronous send ( the calling code is not on the stack ):

      config ShortResponseBody.setup(): success
      test ShortResponseBody.testSynchronous("http://localhost:54392/http1/foo/"): failure
      java.io.EOFException: EOF reached while reading
              at java.net.http/jdk.internal.net.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:557)
              at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:611)
              at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:795)
              at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:170)
              at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
              at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
              at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
              at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:733)
              at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:897)
              at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:240)
              at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:865)
              at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:821)
              at java.base/java.util.ArrayList.forEach(ArrayList.java:1395)
              at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:821)
      config ShortResponseBody.teardown(): success

            chegar Chris Hegarty
            chegar Chris Hegarty
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: