RFR JDK-8087113: Websocket API and implementation
Andrej Golovnin
andrej.golovnin at gmail.com
Sun Apr 10 21:00:21 UTC 2016
Hi Pavel,
I’m sorry for the late response. I was too busy this week.
> Maybe we could somehow melt what you call CloseReason and CloseCode into a
> single entity? Something like (different name is an option too):
>
> public final class CloseReason {
>
> static CloseReason normalClosure(CharSequence reason);
> static CloseReason goingAway(CharSequence reason);
> // ...
> static CloseReason unexpectedCondition(CharSequence reason);
>
> static CloseReason of(int code);
> static CloseReason of(int code, CharSequence reason);
> }
>
> In an application:
>
> ws.sendClose(CloseReason.normalClosure("Too tired"));
> ws.sendClose(CloseReason.of(2016, "Leap year"));
>
> This doesn't solve the first problem of not having code description, but seems
> to solve the second one.
I think it is an acceptable solution. At least I can live with it.
>
>> And I think there should be a way to configure a timeout for sending messages.
>
> As I understand timeout expiration for sendXXX would be a fatal condition (in
> general.) Simply because by the time a returned CF has completed exceptionally,
> some bytes of a message might have been sent already. (That's generally not the
> case with read timeouts see java.net.Socket#setSoTimeout)
>
> What would you expect _additionally_ from the implementation (API guarantees) in
> a case where send completes exceptionally with a timeout in contrast with this
> snippet?
> ws.sendBinary(giganticByteBuffer, true)
> .orTimeout(30, TimeUnit.SECONDS)
> .whenComplete((v, e) -> {
> if (e instanceof TimeoutException) {
> try {
> ws.abort();
> } catch (IOException ignored) { }
> }
> });
>
I would expect to get pre-configured CompletableFutures from the #sendXXX-methods.
So I don’t need to call the #orTimeout()-method on every CompletableFuture returned by
the #sendXXX-methods. But I think the usage the #orTimeout-method is also OK.
BTW, someone should describe in the JavaDocs of CompletableFuture#orTimeout()
what would happen when this method is called multiple times on the same
CompletableFuture with different arguments.
Best regards,
Andrej Golovnin
> BTW, I'm thinking of changing sendXXX methods return type to CompletionStage
> (now it's CompletableFuture), this will cause, for example,
> CompletableFuture#get(long, java.util.concurrent.TimeUnit) not to be directly
> accessible.
>
>> One minor thing off-topic:
>> While changing my code I noticed that the class ProxySelector$StaticProxySelector
>> and the JavaDocs of the ProxySelector#of-method can be improved a little bit:
>>
>> diff -r 589795e4cd38 src/java.base/share/classes/java/net/ProxySelector.java
>> --- a/src/java.base/share/classes/java/net/ProxySelector.java Wed Mar 23 19:33:39 2016 -0700
>> +++ b/src/java.base/share/classes/java/net/ProxySelector.java Mon Mar 28 19:30:24 2016 +0200
>> @@ -165,7 +165,8 @@
>>
>> /**
>> * Returns a ProxySelector which uses the given proxy address for all HTTP
>> - * and HTTPS requests. If proxy is {@code null} then proxying is disabled.
>> + * and HTTPS requests. If the given proxy address is {@code null}
>> + * then proxying is disabled.
>> *
>> * @param proxyAddress
>> * The address of the proxy
>> @@ -178,9 +179,9 @@
>> return new StaticProxySelector(proxyAddress);
>> }
>>
>> - static class StaticProxySelector extends ProxySelector {
>> + private static final class StaticProxySelector extends ProxySelector {
>> private static final List<Proxy> NO_PROXY_LIST = List.of(Proxy.NO_PROXY);
>> - final List<Proxy> list;
>> + private final List<Proxy> list;
>>
>> StaticProxySelector(InetSocketAddress address){
>> Proxy p;
>> @@ -198,9 +199,9 @@
>> }
>>
>> @Override
>> - public synchronized List<Proxy> select(URI uri) {
>> - String scheme = uri.getScheme().toLowerCase();
>> - if (scheme.equals("http") || scheme.equals("https")) {
>> + public List<Proxy> select(URI uri) {
>> + String scheme = uri.getScheme();
>> + if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) {
>> return list;
>> } else {
>> return NO_PROXY_LIST;
>
> CC'ing Michael.
>
More information about the net-dev
mailing list