Hi Anthony,

On 08/09/2016, 18:49, Anthony Vanelverdinghe wrote:
Hi Michael

What's the rationale for not turning all public classes into interfaces, since none of them contain any actual implementation code?

We could do that with little or no impact on the implementation or on calling code.
I will look into it.

On another note, I fail to see the point of HttpClient.Builder::priority: as far as I understand, HTTP/2 priority only comes into play when multiple resources depend on the same resource. But since there's no way to express dependencies between resources, how would this be useful?

There was a desire expressed for the concept of a default priority, which would not have any impact on client behavior, but could still affect the behavior of the server. Client applications might be able to differentiate
requests with different priorities by using different HttpClient instances.

Lastly, some minor remarks: I believe the following factory methods should be moved for consistency
- HttpRequest::noBody --> HttpRequest.BodyProcessor::noBody
- HttpResponse::multiFile --> HttpResponse.MultiProcessor::asFiles

and that "? extends T" should be used instead of "T", in the return type of the following methods
- HttpResponse.BodyHandler::apply, i.e. BodyProcessor<? extends T>
- HttpResponse.BodyProcessor::getBody, i.e. CompletionStage<? extends T>
- HttpResponse.MultiProcessor::onRequest, i.e. Optional<BodyProcessor<? extends T>>

Agreed on both points.

One other thing. I just want to acknowledge, since I haven't before, the work you did, prototyping the change to the request and response processor API, and the use of the Flow Publisher and Subscriber classes in particular. I think that has been a very useful addition to the API.

Thanks,
Michael

On 7/09/2016 19:15, Michael McMahon wrote:
Hi Wenbo,

First, sorry for the delay in replying. We took your comments and prototyped how the major ones
might be accommodated. In particular, we did the following:

- moved "business logic" out of HttpRequest. The methods for sending requests now exist in HttpClient. Given that requests are no longer associated with a client and can be sent through any client, this means that some properties of a request that used to be inherited from the client can no longer be visible in the HttpRequest object, but that is not a problem as far as I can see. This changes the look of the sample code
   in HttpRequest, but doesn't make it any harder to read.

- changed some method names as suggested eg newBuilder()

- added protected constructors to the public classes. This allows alternative implementations
   for use in mocking/test frameworks etc.

- changed the PUT, POST, GET methods in the request builder to only set the method type. PUT, POST takes the request body processor as parameter. A new build() method returns
   the HttpRequest.

- added a method to HttpResponse which returns the "final" request that was sent on the wire for the particular response, which might be different from the user initiated request.

I put an updated apidoc [1] and specdiff [2] up to show the changes. In particular, the sample
code described in the HttpClient docs is updated to reflect the changes.

Thanks,
Michael

[1] http://cr.openjdk.java.net/~michaelm/httpclient/api.1/

[2] http://cr.openjdk.java.net/~michaelm/httpclient/specdiffout.1/package-summary.html

On 26/08/2016, 07:59, Wenbo Zhu wrote:
Hi Michael,

Thanks for the update! The adoption of the Flow API is indeed a big improvement (async flow-control is very hard to get right).

Attached is a feedback doc on this new version. One specific idea to discuss is whether it's possible to release the new HTTP client API as a standalone library (that works on JDK 9).

Thanks,
Wenbo



On Mon, Aug 22, 2016 at 12:56 AM, Michael McMahon <michael.x.mcma...@oracle.com <mailto:michael.x.mcma...@oracle.com>> wrote:

    There is an updated version of the HTTP client API doc [1] and a
    specdiff [2] showing the changes
    proposed from the current version in JDK9 dev.

    The main changes are:

    1) The request and response processors are now based on
    Flow.Publisher and Flow.Subscriber

    2) Response bodies are retrieved synchronously with the response
    headers as part of the
        HttpRequest.response() and responseAsync() methods

    3) Because of the change above, to allow code to examine the
    headers and decide what to do
        with the body before retrieving it, there is a new entity
    called a HttpResponse.BodyHandler
        which is given the status code and headers, and which
    returns a HttpResponse.BodyProcessor.
        Static implementations of both body handlers and body
    processors are provided, to make the
        simple cases easy to code.

    We are currently working in the sandbox repository again and
    will have these changes
    in the main JDK9 dev forest soon.

    Thanks,

    Michael

    [1] http://cr.openjdk.java.net/~michaelm/httpclient/api/
    <http://cr.openjdk.java.net/%7Emichaelm/httpclient/api/>

    [2]
    
http://cr.openjdk.java.net/~michaelm/httpclient/specdiffout/package-summary.html
    
<http://cr.openjdk.java.net/%7Emichaelm/httpclient/specdiffout/package-summary.html>



Reply via email to