Author: markt
Date: Mon Mar 25 23:21:34 2013
New Revision: 1460928

URL: http://svn.apache.org/r1460928
Log:
Add some plumbing in preparation for wss support on the client side

Added:
    tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java   
(with props)
    
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java 
  (with props)
    
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java   
(with props)
    
tomcat/trunk/java/org/apache/tomcat/websocket/SendHandlerToCompletionHandler.java
   (with props)
Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java

Added: tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java?rev=1460928&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java 
(added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java Mon 
Mar 25 23:21:34 2013
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.nio.ByteBuffer;
+import java.nio.channels.CompletionHandler;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+public interface AsyncChannelWrapper {
+
+    Future<Integer> read(ByteBuffer dst);
+
+    <A> void read(ByteBuffer dst, A attachment,
+            CompletionHandler<Integer,? super A> handler);
+
+    Future<Integer> write(ByteBuffer src);
+
+    <A> void write(ByteBuffer[] srcs, int offset, int length, long timeout,
+            TimeUnit unit, A attachment,
+            CompletionHandler<Long,? super A> handler);
+
+    void close();
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java?rev=1460928&view=auto
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java 
(added)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java 
Mon Mar 25 23:21:34 2013
@@ -0,0 +1,67 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.CompletionHandler;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+public class AsyncChannelWrapperNonSecure implements AsyncChannelWrapper {
+
+    private final AsynchronousSocketChannel socketChannel;
+
+    public AsyncChannelWrapperNonSecure(
+            AsynchronousSocketChannel socketChannel) {
+        this.socketChannel = socketChannel;
+    }
+
+    @Override
+    public Future<Integer> read(ByteBuffer dst) {
+        return socketChannel.read(dst);
+    }
+
+    @Override
+    public <A> void read(ByteBuffer dst, A attachment,
+            CompletionHandler<Integer,? super A> handler) {
+        socketChannel.read(dst, attachment, handler);
+    }
+
+    @Override
+    public Future<Integer> write(ByteBuffer src) {
+        return socketChannel.write(src);
+    }
+
+    @Override
+    public <A> void write(ByteBuffer[] srcs, int offset, int length,
+            long timeout, TimeUnit unit, A attachment,
+            CompletionHandler<Long,? super A> handler) {
+        socketChannel.write(
+                srcs, offset, length, timeout, unit, attachment, handler);
+    }
+
+    @Override
+    public void close() {
+        try {
+            socketChannel.close();
+        } catch (IOException e) {
+            // Ignore
+        }
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java?rev=1460928&view=auto
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java 
(added)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java 
Mon Mar 25 23:21:34 2013
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.CompletionHandler;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+public class AsyncChannelWrapperSecure implements AsyncChannelWrapper {
+
+    private final AsynchronousSocketChannel socketChannel;
+
+    public AsyncChannelWrapperSecure(AsynchronousSocketChannel socketChannel) {
+        this.socketChannel = socketChannel;
+    }
+
+    @Override
+    public Future<Integer> read(ByteBuffer dst) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <A> void read(ByteBuffer dst, A attachment,
+            CompletionHandler<Integer,? super A> handler) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Future<Integer> write(ByteBuffer src) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <A> void write(ByteBuffer[] srcs, int offset, int length,
+            long timeout, TimeUnit unit, A attachment,
+            CompletionHandler<Long,? super A> handler) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void close() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1460928&r1=1460927&r2=1460928&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Mon 
Mar 25 23:21:34 2013
@@ -66,6 +66,7 @@ wsWebSocketContainer.defaultConfigurator
 wsWebSocketContainer.endpointCreateFail=Failed to create a local endpoint of 
type [{0}]
 wsWebSocketContainer.httpRequestFailed=The HTTP request to initiate the 
WebSocket conenction failed
 wsWebSocketContainer.invalidHeader=Unable to parse HTTP header as no colon is 
present to delimit header name and header value in [{0}]. The header has been 
skipped.
+wsWebSocketContainer.invalidScheme=The requested scheme, [{0}], is not 
supported. The supported schemes are ws and wss
 wsWebSocketContainer.invalidStatus=The HTTP response from the server [{0}] did 
not permit the HTTP upgrade to WebSocket
 wsWebSocketContainer.invalidSubProtocol=The WebSocket server returned multiple 
values for the Sec-WebSocket-Protocol header
 wsWebSocketContainer.maxBuffer=This implementation limits the maximum size of 
a buffer to Integer.MAX_VALUE

Added: 
tomcat/trunk/java/org/apache/tomcat/websocket/SendHandlerToCompletionHandler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/SendHandlerToCompletionHandler.java?rev=1460928&view=auto
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/SendHandlerToCompletionHandler.java
 (added)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/SendHandlerToCompletionHandler.java
 Mon Mar 25 23:21:34 2013
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.nio.channels.CompletionHandler;
+
+import javax.websocket.SendHandler;
+import javax.websocket.SendResult;
+
+public class SendHandlerToCompletionHandler
+        implements CompletionHandler<Long,Void> {
+
+    private SendHandler handler;
+
+    public SendHandlerToCompletionHandler(SendHandler handler) {
+        this.handler = handler;
+    }
+
+    @Override
+    public void completed(Long result, Void attachment) {
+        handler.onResult(new SendResult());
+    }
+
+    @Override
+    public void failed(Throwable exc, Void attachment) {
+        handler.onResult(new SendResult(exc));
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/websocket/SendHandlerToCompletionHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java?rev=1460928&r1=1460927&r2=1460928&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java Mon Mar 25 
23:21:34 2013
@@ -18,7 +18,6 @@ package org.apache.tomcat.websocket;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.channels.AsynchronousSocketChannel;
 import java.nio.channels.CompletionHandler;
 
 import javax.websocket.CloseReason;
@@ -27,10 +26,10 @@ import javax.websocket.CloseReason.Close
 public class WsFrameClient extends WsFrameBase {
 
     private final ByteBuffer response;
-    private final AsynchronousSocketChannel channel;
+    private final AsyncChannelWrapper channel;
     private final CompletionHandler<Integer,Void> handler;
 
-    public WsFrameClient(ByteBuffer response, AsynchronousSocketChannel 
channel,
+    public WsFrameClient(ByteBuffer response, AsyncChannelWrapper channel,
             WsSession wsSession) {
         super(wsSession);
         this.response = response;

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java?rev=1460928&r1=1460927&r2=1460928&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java 
Mon Mar 25 23:21:34 2013
@@ -16,20 +16,16 @@
  */
 package org.apache.tomcat.websocket;
 
-import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.channels.AsynchronousSocketChannel;
-import java.nio.channels.CompletionHandler;
 import java.util.concurrent.TimeUnit;
 
 import javax.websocket.SendHandler;
-import javax.websocket.SendResult;
 
 public class WsRemoteEndpointImplClient extends WsRemoteEndpointImplBase {
 
-    private final AsynchronousSocketChannel channel;
+    private final AsyncChannelWrapper channel;
 
-    public WsRemoteEndpointImplClient(AsynchronousSocketChannel channel) {
+    public WsRemoteEndpointImplClient(AsyncChannelWrapper channel) {
         this.channel = channel;
     }
 
@@ -55,31 +51,6 @@ public class WsRemoteEndpointImplClient 
 
     @Override
     protected void close() {
-        try {
-            channel.close();
-        } catch (IOException ignore) {
-            // Ignore
-        }
-    }
-
-
-    private static class SendHandlerToCompletionHandler
-            implements CompletionHandler<Long,Void> {
-
-        private SendHandler handler;
-
-        public SendHandlerToCompletionHandler(SendHandler handler) {
-            this.handler = handler;
-        }
-
-        @Override
-        public void completed(Long result, Void attachment) {
-            handler.onResult(new SendResult());
-        }
-
-        @Override
-        public void failed(Throwable exc, Void attachment) {
-            handler.onResult(new SendResult(exc));
-        }
+        channel.close();
     }
 }

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1460928&r1=1460927&r2=1460928&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Mon 
Mar 25 23:21:34 2013
@@ -169,6 +169,8 @@ public class WsWebSocketContainer
             ClientEndpointConfig clientEndpointConfiguration, URI path)
             throws DeploymentException {
 
+        boolean secure = false;
+
         String scheme = path.getScheme();
         if (!("ws".equalsIgnoreCase(scheme) ||
                 "wss".equalsIgnoreCase(scheme))) {
@@ -192,28 +194,38 @@ public class WsWebSocketContainer
         if (port == -1) {
             if ("ws".equalsIgnoreCase(scheme)) {
                 sa = new InetSocketAddress(host, 80);
+            } else if ("wss".equalsIgnoreCase(scheme)) {
+                sa = new InetSocketAddress(host, 443);
+                secure = true;
             } else {
-                // TODO HTTPS support
-                // sa = new InetSocketAddress(host, 443);
-                throw new DeploymentException("TODO: HTTPS");
+                throw new DeploymentException(
+                        sm.getString("wsWebSocketContainer.invalidScheme"));
             }
         } else {
             sa = new InetSocketAddress(host, port);
         }
 
-        AsynchronousSocketChannel channel;
+        AsynchronousSocketChannel socketChannel;
         try {
-            channel = AsynchronousSocketChannel.open();
+            socketChannel = AsynchronousSocketChannel.open();
         } catch (IOException ioe) {
             throw new DeploymentException("TODO", ioe);
         }
-        Future<Void> fConnect = channel.connect(sa);
+
+        Future<Void> fConnect = socketChannel.connect(sa);
+
+        AsyncChannelWrapper channel;
+        if (secure) {
+            channel = new AsyncChannelWrapperSecure(socketChannel);
+        } else {
+            channel = new AsyncChannelWrapperNonSecure(socketChannel);
+        }
+
 
         ByteBuffer response;
         String subProtocol;
         try {
             fConnect.get();
-
             int toWrite = request.limit();
 
             Future<Integer> fWrite = channel.write(request);
@@ -427,7 +439,7 @@ public class WsWebSocketContainer
      * @throws DeploymentException
      */
     private HandshakeResponse processResponse(ByteBuffer response,
-            AsynchronousSocketChannel channel) throws InterruptedException,
+            AsyncChannelWrapper channel) throws InterruptedException,
             ExecutionException, DeploymentException {
 
         Map<String,List<String>> headers = new HashMap<>();



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to