Jaikiran,

> On 2 Jun 2018, at 07:22, Jaikiran Pai <jai.forums2...@gmail.com> wrote:
> 
> Hello,
> 
> I've been experimenting with the new HttpClient API that's part of Java now. 
> I am using the latest EA build 16 of Java 11 from here[1]. I'm still in the 
> early stages of integrating this into one of the libraries where we use HTTP 
> clients.
> 
> Based on my usage so far, I have some minor feedback/questions/enhancement 
> requests that I would like input on:
> 
> 1. The java.net.http.HttpHeaders has firstValue and firstValueAsLong APIs 
> which return an empty Optional if those headers are absent. Would it be 
> possible to introduce a couple of additional APIs of the form:
> 
> String firstValueOrDefault(String name, String defaultValue) // return the 
> actual header value if present, else return the passed default value
> 
> long firstValueAsLongOrDefault(String name, long defaultValue) // return the 
> actual header value, as long, if present, else return the passed default value
> 
> Some of the places where we parse the (response) headers, we check for the 
> presence of some headers and if not present then we default them to certain 
> values (based on certain application specific context). In its current form 
> of the HttpHeaders API, we would either have to write some kind of wrapper 
> API which returns a default value for those headers or keep repeating the 
> logic of checking the returned Optional for empty value, before defaulting it 
> to something.

Already answered.

> 2. Would it be a good idea to add APIs (perhaps in HttpHeaders class) to 
> return values of higher level constructs represented by the headers. Imagine 
> certain well-known headers in the response, like Content-Length and 
> Content-Type. Would it be a good idea to expose higher level APIs of the form 
> getContentLength(), getContentCharset() and such? It probably doesn't add 
> much value to Content-Length header but there's a particular mechanism the 
> charset is supposed to be parsed out of the "Content-Type" header and having 
> it done with the API's implementation would prevent all the parsing/logic in 
> every other application.

Already answered.

> 3. Is the latest API javadoc this one[2]? Based on what I read and 
> experimented so far, I don't see a way to set a value for User-Agent at the 
> HttpClient level. Unless of course, I'm expected to keep setting it on each 
> request that I build in the application? Given that typically, the user agent 
> doesn't change across requests for a particular client, would it be feasible 
> to introduce a way to set this up for each HttpClient?

The following issue tracks a request to be able to set the User-Agent.
  https://bugs.openjdk.java.net/browse/JDK-8203771

Since this is not likely a common operation then setting it through a
specific request header should be sufficient. If experience shows it to
be a pain point then an HttpClient-level configuration could be added in
the future.

> 4. The javadocs currently don't mention anything about connection/resource 
> management within the HttpClient. The only mention I found was here[3] which 
> states:
> 
>  "An HttpClient provides configuration information, and resource sharing, for 
> all requests send through it."
> 
> I'm guessing the resource sharing implies connection reuse?

Correct.

> How long are these (internal) resources maintained?

It is implementation specific. Depends on the protocol, HTTP/1.1 or
HTTP/2. The HTTP/1.1 keep-alive timeout can be set through the
JDK-specific system property, `jdk.httpclient.keepalive.timeout`. The
default timeout is 1200 seconds, and can be large(ish) since the
underlying channel remains registered with the selector and therefore
observes closures.

> Should the users of HttpClient be bothered about it?

I believe not, No.

> The reason I ask is, I don't see a "close()" kind of API on the HttpClient. 
> Does it mean that the internal resource management isn't expected to be tied 
> to the usage of the HttpClient instance?

Having an explicit close on such an asynchronous API is problematic; how
does one know when to call close? As such there is no explicit way to
close an HttpClient, instead all resources associated with a client
instance are automatically cleaned up, through a java.lang.ref.Cleaner,
when the HttpClient is eligible for Cleaning.

Resource sharing is on a per-client basis. To share resources across
multiple contexts, then share the client across said contexts
explicitly.

--- 

We continue to develop the latest HTTP Client code in the sandbox [1],
and expect to bring a number of changes into the mainline, jdk/jdk repo,
soon.

-Chris.

[1] http://openjdk.java.net/groups/net/httpclient/

Reply via email to