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

Supplementary minor HTTP Client spec clarifications

XMLWordPrintable

    • minimal
    • Java API
    • SE

      Summary

      A number of small specification clarifications and rewordings to supplement the already approved HTTP Client, JDK-8197565.

      Problem

      Feedback from a number of sources including, JCK, both internal and external engineers, have identified:

      • a number of small deficiencies in the specification that require clarification, and

      • opportunities to simplify the API by removing a superfluous public type and enum value, and

      • opportunities to reword certain targeted sections of text, mainly in WebSocket, to avoid ambiguity thus avoiding misunderstanding.

      Solution

      1) From HttpClient.Redirect remove SAME_PROTOCOL and SECURE. Replace with NORMAL. Leaving { ALWAYS, NORMAL, NEVER }. It has been observed that the previously named SECURE was not really appropriately named and should be renamed to NORMAL, since it will likely be suitable for most normal cases. Given the newly named, aforementioned, NORMAL, SAME_PROTOCOL appears oddly named, possibly confusing, and not likely to be used.

      2) Remove WebSocket.MessagePart. This enum was used on the the receiving side to indicate whether the delivery of message was complete, or not. It is asymmetric with the sending side, which uses a simple boolean for this purpose. Additionally, it has been observed that handling received messages with a simple boolean significantly reduces and simplifies the receiving code logic. Determination of messages being delivered as a WHOLE, one of the benefits and the main purposes for the aforementioned MessagePart, has proved to not carry its own weight. Note: as part of this review, MessagePart, and variants thereof, have been considered and dismissed, on the sending side, as they obstruct one of the most common patterns of iterating over data and sending it as chunks.

      3) Throughout the WebSocket documentation care has been taken to avoid ambiguity between websocket messages and the number of invocations of the WebSocket.Listener. The number of messages may not equal the number of listener invocations, as partial messages may be delivered. This has been a source of confusion when folk first start using the API.

      4) WebSocket does not ( for good reasons ) use the Java SE reactive-stream support in java.util.concurrent.Flow, but its request ( invocation demand ) is heavily influenced by it, and the API can be used to build higher-level Flow's using such. This concept, since analogous to Flow ( Subscriber and Subscription), has been clarified. These changes touch a lot of documentation, but it has not changed semantically.

      5) The WebSocket specification around closure has been tightened up and several corner cases clarified. Again, this touches many parts of the spec, but has not changed significantly.

      6) Outbound data flow, in the WebSocket API, is pressured by CompletableFutures returned by the sendBinary and sendText methods. Equivalent have been added to the less-data driven sendPing and sendPong methods to prevent outbound saturation.

      7) The WebSocket API throws NullPointerException directly from methods where a null value is passed, but completes exceptionally returned CompletableFutures in almost all other cases. This is a decision that was made to simplify and streamline error handling. The HttpClient API exposes significantly less CompletableFutures, typically just a single CF from sendAsync, which results in less burdensome error handling, therefore throws ( rather than completes exceptionally ) when illegal arguments are passed.

      Specification

      Specdiff in attached zip file, or browsable online at: http://cr.openjdk.java.net/~chegar/httpclient/supplementary/overview-summary.html

            chegar Chris Hegarty
            chegar Chris Hegarty
            Daniel Fuchs, Pavel Rappo (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: